ArgumentOutOfRange Error

本文关键字:Error ArgumentOutOfRange | 更新日期: 2023-09-27 18:08:47

我正在尝试编写一个带有进度条的文件复制程序,但它在百分比计算时崩溃。下面是我的代码:

private void operation()
    {
        byte[] buffer = new byte[1024 * 1024];
        using (streamSFD)
        {
            using (Stream streamOFD = new FileStream(textBox1.Text, FileMode.Open))
            {
                while (streamOFD.Read(buffer, 0, buffer.Length) > 0)
                {
                    streamSFD.Write(buffer, 0, buffer.Length);
                    progressBar1.Value = percentage((int)streamOFD.Length, (int)streamSFD.Length);
                    label2.Text = streamSFD.Length.ToString() + "/" + streamOFD.Length.ToString();
                    label1.Text = progressBar1.Value.ToString() + "%";
                }
            }
        }
    }
    private int percentage(int x, int y)
    {
        return (y * 100) / x;
    }

ArgumentOutOfRange Error

从问题的注释中可以清楚地看出,percentage方法返回的是负值。这是怎么发生的?

注意属性Stream。Length是一个long类型, Stream也是。位置(这可能也是您想要用于计算进度百分比的属性)。

long(宽度为64位)转换为int(宽度为32位)将只考虑较低的32位,从而截断long

假设您有以下正long值:

0x1FFFFFF00 (hex) = 8589934336 (decimal)

将其转换为int将丢弃上面的32位,导致:

0xFFFFFF00 (hex) = -256 (decimal)

(在大多数CPU/ALU体系结构中,负整数通常由其绝对值的两个补数表示。)

解决这个问题的关键是不要截断长值。因为生成的百分比值应该是一个int值,范围在0…100之间(这是进度条的百分比),数学。Min将用于限制大于100的任何计算结果(尽管对于问题中给出的cod,计算结果不应超过100)。

private int percentage(long x, long y)
{
    return (int) Math.Min( (y * 100) / x, 100L );
}

现在,转换流。长度int不再需要:

progressBar1.Value = percentage(streamOFD.Length, streamSFD.Length);