0

我正在使用 FileInfo.Length 来获取文件的大小,然后将其发布到 GoogleDoc。问题是我从 FileInfo.Length... 得到负值。

我在网上四处寻找一些解决方案,但找不到任何其他原因......除了 FileInfo.Length 应该是 Long 而我将其转换为 Int ......这可能与它?

这是我的代码:

                int size = (int)file.Length;
                string name = file.Name;
                googleBot.insertArchiveRow(name, size);
                progressBar.Value++;
                this.UpdateLayout();

铸造会在这里给我带来问题吗?

谢谢!

4

3 回答 3

4

是的。铸造可能会给您带来问题。

文件有多大?

“FileInfo.Length 应该是 Long,我将其转换为 Int .....”

如果大于2^31 - 1 然后强制转换为 anint可能是负数....

例如

        long l = (long)Math.Pow(2, 31);
        int i = (int) l;
        Console.WriteLine("{0}", l);
        Console.WriteLine("{0}", i);

印刷:

2147483648
-2147483648

底线:FileInfo.Length是 a long,所以这样对待它。

于 2013-01-26T00:06:18.597 回答
4

避免这样的意外,让编译器生成代码来执行错误检查:

 int size = checked((int)file.Length);

您现在将得到一个 OverflowException 而不是一个负值。

于 2013-01-26T00:24:19.057 回答
1

是的,很容易,事实上...

int.MaxValue ==  2147483647 == 0x7FFFFFFF
int.MinValue == -2147483648 == 0x80000000

int.MaxValue2^31 - 1,所以大小约为 2GB;任何比这更大的文件都会读为负数,直到你再次循环回来,也就是说。:)

于 2013-01-26T00:17:59.387 回答