我在Windows系统中使用Visual Studio编写了以下的C++代码,用于查找文件的大小:
(p_findFileData->nFileSizeHigh * MAXDWORD) + p_findFileData->nFileSizeLow);
如果文件大小大于4GB,这种方法无法给出正确的文件大小。经过一些研究后,我尝试了以下方法:
(p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow);
据我所知,nfilesizehigh和nfilesizelow各为32位,共同构成文件大小的64位值。如果文件大小值大于32位,则我们需要将maxdword(在我的情况下为0xffffffff)乘以nfilesizehigh。但第二种解决方案也没有奏效,给出了比实际文件大小更小的结果。我又尝试了以下方法:
ULONGLONG FileSize = (FindFileData.nFileSizeHigh * 4294967296) + FindFileData.nFileSizeLow;
而且它还起作用。此外,我使用了另一种解决方案,可以获得文件大小:
ULONGLONG FileSize = FindFileData.nFileSizeHigh;
FileSize <<= sizeof( FindFileData.nFileSizeHigh ) *8;
FileSize |= FindFileData.nFileSizeLow;
上述解决方案也可行:
我想知道为什么前两个解决方案不起作用,如果可能的话,请解释一下最后一个解决方案,因为我想了解代码的内部工作原理。非常感谢您的帮助。
MAXDWORD
= (2^32)-1,所以离4GB只有一步之遥。sizeof(FileSizeHigh) * 8
是FileSizeHigh
的位数(32)。左移(<<
)与乘以2^32
相同。实际上,我认为正确的操作应该是移位sizeof(FileSizeLow) * 8
,因为这是低位中位数的位数 - 它也是32位,但如果有人将FileSizeLow
或FileSizeHigh
更改为64位,则数学将继续工作[除非需要比ULONGLONG
更大的存储空间]。 - Mats Petersson(static_cast<ULONGLONG>(MAXDWORD)+1)
来避免它变成0
(这有点像汽车上的里程表,如果你已经行驶了99999英里,下一次就会翻转成00000 - 二进制中的全1也是如此)。 - Mats Petersson