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

标签 c++ windows winapi

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

相关文章:

windows - Visual Studio Code 安装位置

c++ - 使用 win32 线程进行矩阵乘法

c++ - 使用 Microsoft Detours - 一堆未定义的

c++ - 如何消除 RICHEDIT 控件的 MessageBeep?

c++ - boost optional 承认继承?

c++ - 使用哪个编辑器?用于编码 c/c++

c++ - 如何停止 gSOAP 操作

c++ - 人们需要什么来运行我的应用程序?

c++ - 在运行时使用用户定义的文字

windows - DB2:如何在 Windows 下为 db2clp 设置编码?