即使文件已经打开以进行独占访问,如何获取文件大小?

时间:2015-11-16 05:02:28

标签: c winapi

我发现获取文件大小的唯一方法是使用GetFileSizeEx()函数。但是,此函数需要HANDLE文件,如果文件已经打开以进行独占访问,我将无法获得HANDLE,因此我将无法获得大小

即使已经打开了独占访问权限,有没有办法获得文件大小?

1 个答案:

答案 0 :(得分:3)

编辑,(见评论)
使用GetFileInformationByHandle

ULONGLONG filesize = 0; 
HANDLE h = CreateFile(filename, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
if (h != INVALID_HANDLE_VALUE)
{ 
    BY_HANDLE_FILE_INFORMATION info;
    memset(&info, 0, sizeof(BY_HANDLE_FILE_INFORMATION));
    if (GetFileInformationByHandle(h, &info)) 
    { 
        ULARGE_INTEGER ul = { 0 };
        ul.LowPart = info.nFileSizeLow; 
        ul.HighPart = info.nFileSizeHigh;
        filesize = ul.QuadPart; 
    } 
    CloseHandle(h); 
} 

另一种方法,请参阅GetFileAttributesEx

还有FindFirstFile,但这可能不准确

来自FindFirstFile

的MSDN文档
  

注意在极少数情况下或在负载很重的系统上,文件属性   有关NTFS文件系统的信息在此时可能不是最新信息   函数被调用。确保获取当前的NTFS文件   系统文件属性,调用GetFileInformationByHandle函数。

使用FindFirstFile

WIN32_FIND_DATA ffd;
HANDLE hfind = FindFirstFile(filename, &ffd);
if (hfind != INVALID_HANDLE_VALUE)
{
    DWORD filesize = ffd.nFileSizeLow;

    //for files larger than 4GB:
    ULARGE_INTEGER ul;
    ul.LowPart = ffd.nFileSizeLow;
    ul.HighPart = ffd.nFileSizeHigh;
    ULONGLONG llfilesize = ul.QuadPart;

    FindClose(hfind);
}