我正在尝试获取大文件 (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/