C# 参数超出范围错误

C# 参数超出范围错误,c#,C#,我试图用progressbar编写一个文件复制程序,但它在百分比计算时崩溃。以下是我的代码: private void operation() { byte[] buffer = new byte[1024 * 1024]; using (streamSFD) { using (Stream streamOFD = new FileStream(textBox1.Text, FileMode.Open))

我试图用progressbar编写一个文件复制程序,但它在百分比计算时崩溃。以下是我的代码:

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方法返回负值。这怎么会发生

请注意,该属性是一个长的,也是一个(这可能也是您要用于计算进度百分比的属性)

将long(64位的宽度)强制转换为int(32位的宽度)将通过只考虑较低的32位来截断long

假设您具有以下正长值:

将该值转换为int将丢弃较高的32位,从而导致:

0xFFFFFF00 (hex) = -256 (decimal)
(在大多数CPU/ALU体系结构中,负整数通常由其绝对值的大小表示。)

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

现在,不再需要将Stream.Length强制转换为int:

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

无关的问题:你写得太多了。只需写入从
Read()
.progressBar1.Value=百分比((int)streamOFD.length,(int)streamSFD.length)返回的长度;这部分给出了一个例外。你能不能花一分钟的时间来检查文档,了解它抛出错误的原因/条件?返回的值是-30。这就是原因,但它为什么会返回-30?我明白了。只有当其中一个流的长度超过int.MaxValue时,才会发生这种情况。请注意,Stream.Length是一个长值。例如,0x01FFFF0000是正长值。将其截断为整数将导致0xFFFF0000-这是一个负整数。。。
private int percentage(long x, long y)
{
    return (int) Math.Min( (y * 100) / x, 100L );
}
progressBar1.Value = percentage(streamOFD.Length, streamSFD.Length);