我发现获取文件大小的唯一方法是使用GetFileSizeEx()
函数。但是,此函数需要HANDLE
文件,如果文件已经打开以进行独占访问,我将无法获得HANDLE
,因此我将无法获得大小
即使已经打开了独占访问权限,有没有办法获得文件大小?
答案 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
,但这可能不准确
注意在极少数情况下或在负载很重的系统上,文件属性 有关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);
}