gpt4 book ai didi

c++ - 检查文件大小而不用 C++ 打开文件?

转载 作者:IT老高 更新时间:2023-10-28 12:46:28 31 4
gpt4 key购买 nike

我正在尝试获取大文件 (12gb+) 的文件大小,但我不想打开文件这样做,因为我认为这会占用大量资源。有什么好的API可以做到这一点吗?我在Windows环境中。

最佳答案

您应该调用 GetFileSizeEx比旧的 GetFileSize 更易于使用.您将需要通过调用 CreateFile 打开文件,但这是一个廉价的操作。您认为打开一个文件(即使是 12GB 文件)代价高昂的假设是错误的。

您可以使用以下函数来完成工作:

__int64 FileSize(const wchar_t* name)
{
HANDLE hFile = CreateFile(name, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile==INVALID_HANDLE_VALUE)
return -1; // error condition, could call GetLastError to find out more

LARGE_INTEGER size;
if (!GetFileSizeEx(hFile, &size))
{
CloseHandle(hFile);
return -1; // error condition, could call GetLastError to find out more
}

CloseHandle(hFile);
return size.QuadPart;
}

还有其他 API 调用会返回文件大小,而不会强制您创建文件句柄,特别是 GetFileAttributesEx .然而,这个函数只是在幕后打开文件是完全合理的。

__int64 FileSize(const wchar_t* name)
{
WIN32_FILE_ATTRIBUTE_DATA fad;
if (!GetFileAttributesEx(name, GetFileExInfoStandard, &fad))
return -1; // error condition, could call GetLastError to find out more
LARGE_INTEGER size;
size.HighPart = fad.nFileSizeHigh;
size.LowPart = fad.nFileSizeLow;
return size.QuadPart;
}

如果您使用 Visual Studio 进行编译并希望避免调用 Win32 API,那么您可以使用 _wstat64 .

这是一个基于 _wstat64 的函数版本:

__int64 FileSize(const wchar_t* name)
{
__stat64 buf;
if (_wstat64(name, &buf) != 0)
return -1; // error, could use errno to find out more

return buf.st_size;
}

如果性能曾经成为您的问题,那么您应该为您所针对的所有平台上的各种选项计时,以便做出决定。不要以为不需要您调用 CreateFile 的 API 会更快。他们可能是,但你不会知道,直到你计时。

关于c++ - 检查文件大小而不用 C++ 打开文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8991192/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com