检查文件大小而不在C中打开文件?

我正在尝试获取文件(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会更快.他们可能是,但在你有时间之前你不会知道.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...