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;
}
从问题的注释中可以清楚地看出,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);