C ++:不正确的文件大小计算WinAPI

时间:2017-03-14 07:58:33

标签: c++ winapi

这里我的代码:

#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
    hFind = FindFirstFile("C:\\Windows10.official.16.November.2016.iso",&FindFileData);
    if ( hFind == INVALID_HANDLE_VALUE )
        cout << "Can't Find the File\n";
    cout << ( ( FindFileData.nFileSizeHigh * ( MAXDWORD + 1 ) ) + FindFileData.nFileSizeLow );
    return 0;
}

输出是:

2300968960

但实际文件大小为6.14 GB 所以输出应该像

6592774799

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您需要做的是将表达式( ( FindFileData.nFileSizeHigh * ( MAXDWORD + 1 ) ) + FindFileData.nFileSizeLow )的至少一部分扩展为64位以防止32位溢出。

我在这里使用位操作,因为我觉得这样的事情更自然,但同样的原则适用:

uint32_t hi = 0x12345678, lo = 0x90ABCDEF;
uint64_t hilo = ( static_cast<uint64_t>( hi ) << 32 ) | lo;

因此将hi转换为64位将确保整个计算以64位完成。

Live Demo.