两种方式获取文件大小
INT64 MyGetFileSize(const CString& strFilePath)
{
//获取文件大小
INT64 nLen = 0;
WIN32_FILE_ATTRIBUTE_DATA attr = { 0 }; //文件属性结构体
if (FALSE == GetFileAttributesEx(strFilePath, GetFileExInfoStandard, &attr)) //获取文件属性
{
//获取文件大小失败
}
else
{
nLen = (ULONGLONG(attr.nFileSizeHigh) << 32) | ((attr.nFileSizeLow) & 0xFFFFFFFF);
}
return nLen;
}
获取目录大小
LONGLONG FileSize(CString file) const noexcept
{
HANDLE fp = CreateFile(file.GetBuffer(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
LARGE_INTEGER info;
memset(&info, 0, sizeof(info));
GetFileSizeEx(fp, &info);
return info.QuadPart;
}
LONGLONG DirectorySize(CString path) const noexcept
{
__int64 size = 0;
WIN32_FIND_DATA fd;
memset(&fd, 0, sizeof(fd));
::SetCurrentDirectory(path.GetBuffer()); // 设置当前的工作路径
HANDLE hd = ::FindFirstFile(_T("*.*"), &fd); // 查找任意文件
if (hd != INVALID_HANDLE_VALUE) { // 如果不是一个空的文件夹
do
{
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 枚举到的第一个文件是不是文件夹
CString name = fd.cFileName;
if (name != _T(".") && name != _T("..")) { // 如果不是系统文件夹
size += DirectorySize(fd.cFileName);
::SetCurrentDirectory(_T(".."));
}
}
else {
size += FileSize(fd.cFileName);
}
} while (FindNextFile(hd, &fd));
::FindClose(hd);
}
return size;
}