查询一个文件夹目录的大小

前几天看到一个试用递归方式求解文件夹目录大小的代码,但是在实际项目使用中一般去避免使用递归,因为这样是比较耗时的,因此我将此代码改为了非递归方式。


//递归方式
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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值