前几天看到一个试用递归方式求解文件夹目录大小的代码,但是在实际项目使用中一般去避免使用递归,因为这样是比较耗时的,因此我将此代码改为了非递归方式。
//递归方式
ULONGLONG GetDirFileSize( LPCTSTR strDir )
{
TCHAR szFilePath[ MAX_PATH ] = { 0 };
wcsncpy( szFilePath, strDir, MAX_PATH );
PathAppend( szFilePath, _T( "\\*.*" ) );
WIN32_FIND_DATA fd = { 0 };
HANDLE hFileFind = FindFirstFile( szFilePath, &fd );
ULONGLONG dwSize = 0;
if( INVALID_HANDLE_VALUE == hFileFind )
{
return 0;
}
do
{
if( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
//Is Dir 并且非 ./.. 文件夹目录
if( StrCmpI( fd.cFileName, _T( "." ) ) && StrCmpI( fd.cFileName, _T( ".." ) ) )
{
TCHAR szTmpPath[ MAX_PATH ] = { 0 };
wcsncpy( szTmpPath, strDir, MAX_PATH );
PathAppend( szTmpPath, fd.cFileName );
dwSize += GetDirFileSize( szTmpPath );
}
}
else
{
dwSize += ( (ULONGLONG)(fd.nFileSizeHigh) << 32) + fd.nFileSizeLow ;
}
}while( FindNextFile( hFileFind, &fd ) );
FindClose( hFileFind );
return dwSize;
}
//非递归方式
int EnumDirFile(LPCTSTR strDir, vector<FILEINFO>& vec)
{
TCHAR oriFilePath[ MAX_PATH ] = { 0 };
TCHAR szFilePath[ MAX_PATH ] = { 0 };
wcsncpy( oriFilePath, strDir, MAX_PATH);
wcsncpy( szFilePath, strDir, MAX_PATH);
PathAppend( szFilePath, _T("\\*.*"));
WIN32_FIND_DATA fd = { 0 };
HANDLE hFileFind = FindFirstFile( szFilePath, &fd);
if( INVALID_HANDLE_VALUE == hFileFind )
{
return 0;
}
do
{
if( StrCmpI(fd.cFileName, _T(".")) && StrCmpI(fd.cFileName, _T(".."))) //过滤掉 ./.. 文件夹
{
fileInfo.nFileSizeHigh = fd.nFileSizeHigh;
fileInfo.nFileSizeLow = fd.nFileSizeLow;
wcsncpy(fileInfo.cFilePath, oriFilePath, MAX_PATH);
PathAppend(fileInfo.cFilePath, fd.cFileName); //完整路径
fileInfo.dwFileAttributes = fd.dwFileAttributes;
vec.push_back(fileInfo);
}
} while ( FindNextFile(hFileFind, &fd));
FindClose( hFileFind );
return 0;
}
int GetDirFile( LPCTSTR strDir)
{
vector<FILEINFO> vec;
EnumDirFile(strDir, vec); //枚举当前文件夹下所有文件
ULONGLONG dwSize = 0;
//遍历所有文件,计算整体文件的大小
for(int index = 0; vec.size() > index; ++index)
{
if( vec[index].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //判断该文件是一个文件夹
{
EnumDirFile( vec[index].cFilePath, vec);
}
else //如果不是文件夹,直接把文件大小加上
dwSize += ( (ULONGLONG)(vec[index].nFileSizeHigh) << 32) + vec[index].nFileSizeLow;
}
return dwSize;
}