[visual-studio]在 windows 中找到正确的文件大小超过 4 gb

发布时间: 2014/3/1 3:26:39
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用这个 c + + 代码来在窗口 (使用 visual studio) 中找到的一些文件的文件大小:

(p_findFileData->nFileSizeHigh * MAXDWORD) + p_findFileData->nFileSizeLow);

这没有给我正确文件大小如果文件大于 4 gb。我试过一些研究后:

(p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow); 

当我读到的 64 位的文件大小的值的每个 32 位的 nfilesizehigh 和 nfilesizelow,如果文件大小值大于 32 位,我们会将 maxdword (这在我的案子是 0xffffffff) 乘以 nfilesizehigh。第二种解决方案还没有工作,并给了我一个较小的大小比那是什么。我再试过这个:

ULONGLONG FileSize = (FindFileData.nFileSizeHigh * 4294967296) + FindFileData.nFileSizeLow;

和它的工作。此外我用另一种解决方案换太这样的文件大小:

 ULONGLONG FileSize = FindFileData.nFileSizeHigh;
 FileSize <<= sizeof( FindFileData.nFileSizeHigh ) *8; 
 FileSize |= FindFileData.nFileSizeLow;

上述解决方案的工作太:

我想要知道为什么第一次 2 解决方案没有工作,也解释为最后一个解决方案如果可能的话,我想要知道代码的内部工作。帮助非常感谢。

解决方法 1:

我会使用:

ULONGLONG FileSize = (static_cast<ULONGLONG>(FindFileData.nFileSizeHigh) <<
                      sizeof(FindFileData.nFileSizeLow) *8) |
                     FindFileData.nFileSizeLow;

需要将 32 位值转换为 64 位的值之前它进入文件大小变量强制转换为 ULONGLONG。

您当然可以使用一种乘法运算太-但它并不是"更好"在任何特定的方式,和最有可能稍微慢点 [大概没什么大不了在这特定的情况下,但在使用乘法可以认为没有任何好处。

和现在的"不工作"的变体:

即使这正常工作:

 (p_findFileData->nFileSizeHigh * MAXDWORD) + p_findFileData->nFileSizeLow);

你的错误值,因为 MAXDWORD 是一个小于 4 GB,所以你最终会与错误值 [是的或许是关闭的但它将是错误的最少 1 字节可能更多]。然而,因为我们面对的 32 位值,它实际上成为:

 -p_findFileData->nFileSizeHigh + p_findFileData->nFileSizeLow;

因为 MAXDWORD -1 相同 (是的很可能是一个无符号的值,但如果你使溢出这样的值,它的行为有负的符号值一样)。

这一是数学上正确的但不起作用,它会溢出一个 32 位值。

 (p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow);

所以你 low part + (0 * high part) 这当然是不对的。

与强制转换,这将工作:

 static_cast<ULONGLONG>(p_findFileData->nFileSizeHigh) * (MAXDWORD+1) +
 p_findFileData->nFileSizeLow;
官方微信
官方QQ群
31647020