如何在C++中获取大文件(10GB)的文件大小?

k5hmc34c  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(207)

我试图获得16 GB的txt文件的文件大小。但我得到了不同的大小与真实的大小。谁能帮助我?

HANDLE FileHandle = INVALID_HANDLE_VALUE;
long long FileSize;
FileHandle = CreateFileA(szInputFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
if(FileHandle == INVALID_HANDLE_VALUE)
    return;

FileSize = GetFileSize(FileHandle, NULL);
5n0oy7gb

5n0oy7gb1#

正如您在GetFileSize documentation中所看到的:
如果文件大小超过32位,则必须提供第二个参数,以填充大小的高32位。
然后,您可以结合2,以获得最终的文件大小。
代码示例:

HANDLE FileHandle = INVALID_HANDLE_VALUE;
// ... (initialize FileHandle)

DWORD FileSizeLow;
DWORD FileSizeHigh;
//------------------------------------vvvvvvvvvvvvvv-
FileSizeLow = GetFileSize(FileHandle, &FileSizeHigh);
// Handle error case (see documentation link above) ...
uint64_t FileSize = ((uint64_t)FileSizeHigh << 32) + FileSizeLow;
// ...

或者,如@IInspectable所述,您可以使用GetFileSizeEx

LARGE_INTEGER FileSizeL;
if (GetFileSizeEx(FileHandle, &FileSizeL))
{
    LONGLONG FileSize = FileSizeL.QuadPart;  // 64bit signed
    // ...
}
else
{
    // Handle error ...
}
    • 注意:**使用GetFileSizeEx实际上是推荐的方法(上面的文档明确提到了它),这要归功于64位的单一结果和更容易的错误处理。
yc0p9oo0

yc0p9oo02#

GetFileSizedocumentation建议使用GetFileSizeEx,因为GetFileSizeEx更简单:

LARGE_INTEGER FileSize;
if (!GetFileSizeEx(FileHandle, &FileSize))
{
  std::cout << "error getting file size\n";
}
else
{
  std::cout << "file size: " << FileSize.QuadPart << "\n";
}

对于一个更多的C++解决方案std::filesystem::file_size(尽管这只适用于路径,而不适用于句柄):

auto FileSize = std::filesystem::file_size(szInputFileName)
relj7zay

relj7zay3#

如果你不需要打开HANDLE文件,你可以使用FindFirstFile()GetFileAttributesEx()从文件系统查询文件大小,例如:

WIN32_FIND_DATA fd;
HANDLE FindHandle = FindFirstFile(szInputFileName, &fd);
if (FindHandle == INVALID_HANDLE_VALUE)
    return;
FindClose(FindHandle);

ULONGLONG FileSize = (static_cast<ULONGLONG>(fd.nFileSizeHigh) << 32) + fd.nFileSizeLow;
WIN32_FILE_ATTRIBUTE_DATA fad;
if (!GetFileAttributesEx(szInputFileName, GetFileExInfoStandard, &fad))
    return;

ULONGLONG FileSize = (static_cast<ULONGLONG>(fad.nFileSizeHigh) << 32) + fad.nFileSizeLow;

相关问题