//遍历文件夹函数
DWORD64 GetFolderSize(LPCTSTR lpPath)
{
DWORD64 dwSize = 0;
TCHAR szFind[MAX_PATH] = {_T("\0")};
WIN32_FIND_DATA findFileData;
BOOL bRet;
_tcscpy_s(szFind, MAX_PATH, lpPath);
_tcscat_s(szFind, _T("\\*.*")); //这里一定要指明通配符,不然不会读取所有文件和目录
HANDLE hFind = ::FindFirstFile(szFind, &findFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
return 0;
}
//遍历文件夹
while (TRUE)
{
if (findFileData.cFileName[0] != _T('.'))
{//不是当前路径或者父目录的快捷方式
_tprintf(_T("%s\\%s\n"), lpPath, findFileData.cFileName);
if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{//这是一个普通目录
//设置下一个将要扫描的文件夹路径
_tcscpy_s(szFind, MAX_PATH, lpPath);
_tcscat_s(szFind, _T("\\"));
_tcscat_s(szFind, findFileData.cFileName);
//遍历该目录
dwSize += GetFolderSize(szFind);
}
}
//如果是当前路径或者父目录的快捷方式,或者是普通目录,则寻找下一个目录或者文件
dwSize += findFileData.nFileSizeLow;
bRet = ::FindNextFile(hFind, &findFileData);
if (!bRet)
{
break;
}
}
::FindClose(hFind);
return dwSize;
}
BOOL CABCToolDlg::CheckDiskSpace(CHAR cDiskLable, CString csPcFilePath)
{
// 判断磁盘空间是否大于文件大小
CString csDisk;
csDisk.Format("%c", cDiskLable);
csDisk += ":";
ULARGE_INTEGER pDiskUserAvalibleSpace;
ULARGE_INTEGER pDiskTotalSpace;
ULARGE_INTEGER pDiskRemainSpace;
CString csErrorOfDiskSpace = csDisk;
if(GetDiskFreeSpaceEx((LPCTSTR)csDisk, &pDiskUserAvalibleSpace, &pDiskTotalSpace, &pDiskRemainSpace))
{
DWORD64 nFileSize = GetFolderSize(csPcFilePath);
if (pDiskUserAvalibleSpace.QuadPart < nFileSize)
{
csErrorOfDiskSpace += "盘剩余空间小于拷贝的文件大小!";
AfxMessageBox(csErrorOfDiskSpace);
return FALSE;
}
}
else
{
csErrorOfDiskSpace += "剩余空间获取失败!";
AfxMessageBox(csErrorOfDiskSpace);
return FALSE;
}
return TRUE;
}