pha*_*ays 5 c++ windows winapi visual-studio
我使用这个c ++代码来查找windows中某些文件的文件大小(使用visual studio):
(p_findFileData->nFileSizeHigh * MAXDWORD) + p_findFileData->nFileSizeLow);
Run Code Online (Sandbox Code Playgroud)
如果文件大于4gb,这不会给我正确的文件大小.经过一些研究,我试过:
(p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow);
Run Code Online (Sandbox Code Playgroud)
当我读到nfilesizehigh和nfilesizelow是文件大小的64位值的32位时,如果filesize值大于32位,我们将maxdword(在我的情况下是0xffffffff)乘以nfilesizehigh.第二个解决方案也没有用,给我的尺寸比它的尺寸小.我再次试过这个:
ULONGLONG FileSize = (FindFileData.nFileSizeHigh * 4294967296) + FindFileData.nFileSizeLow;
Run Code Online (Sandbox Code Playgroud)
它起作用了.我还使用了另一种解决方案来获取文件大小:
ULONGLONG FileSize = FindFileData.nFileSizeHigh;
FileSize <<= sizeof( FindFileData.nFileSizeHigh ) *8;
FileSize |= FindFileData.nFileSizeLow;
Run Code Online (Sandbox Code Playgroud)
上述解决方案也有效:
我想知道为什么前两个解决方案不起作用,并且如果可能的话也解释最后一个解决方案,因为我想知道代码的内部工作.非常感谢帮助.
我会用:
ULONGLONG FileSize = (static_cast<ULONGLONG>(FindFileData.nFileSizeHigh) <<
sizeof(FindFileData.nFileSizeLow) *8) |
FindFileData.nFileSizeLow;
Run Code Online (Sandbox Code Playgroud)
在进入FileSize变量之前,需要将32位值转换为64位值,然后转换为ULONGLONG.
当然你也可以使用乘法 - 但它不是以任何特定方式"更好",并且很可能稍微慢一点[在这种特殊情况下可能没什么大不了的,但是使用乘法我没看到任何好处.
现在对于"不工作"的变种:
即使这样做有效:
(p_findFileData->nFileSizeHigh * MAXDWORD) + p_findFileData->nFileSizeLow);
Run Code Online (Sandbox Code Playgroud)
你得到了错误的值,因为它MAXDWORD是一个小于4GB的值,所以你最终得到了错误的值[是的,它可能是接近的,但它至少会丢错1个字节,可能还会更多].但是,由于我们处理32位值,它实际上变为:
-p_findFileData->nFileSizeHigh + p_findFileData->nFileSizeLow;
Run Code Online (Sandbox Code Playgroud)
因为MAXDWORD它与-1相同(是的,它可能是一个无符号值,但是如果你以这种方式使值溢出,它的行为与负的有符号值相同).
这个在数学上是正确的,但由于它溢出32位值的事实不起作用.
(p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow);
Run Code Online (Sandbox Code Playgroud)
所以你得到的low part + (0 * high part)当然是不正确的.
使用强制转换,这将起作用:
static_cast<ULONGLONG>(p_findFileData->nFileSizeHigh) * (MAXDWORD+1) +
p_findFileData->nFileSizeLow;
Run Code Online (Sandbox Code Playgroud)
使用ULARGE_INTEGERstruct来组合值,而不是尝试手动计算/移位它们:
ULARGE_INTEGER ul;
ul.HighPart = p_findFileData->nFileSizeHigh;
ul.LowPart = p_findFileData->nFileSizeLow;
ULONGLONG FileSize = ul.QuadPart;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3619 次 |
| 最近记录: |