VC++计算文件和文件夹的大小(附源码)

       有时在对文件或文件夹进行操作时,需要计算文件或文件夹的大小,比如在聊天框中发起文件传输时。那该调用哪些系统API才能算出文件和文件夹的大小呢?本文就来简单的讲述一下。

VC++计算文件和文件夹的大小(附源码)_第1张图片

1、计算单个文件的大小

       直接调用系统API函数FindFirstFile就可以得到文件的属性及大小信息,考虑到文件可能会比较大,所以需要使用64整数类型,相关代码如下:

// 计算单个文件的大小
BOOL CalcFileSize( CString strFilePath, u64& u64FileSzie )
{
	u64FileSzie = 0;

	WIN32_FIND_DATA wfd;
	HANDLE hFindFile = FindFirstFile( strFilePath, &wfd ); 
	if ( hFindFile == INVALID_HANDLE_VALUE )
	{ 
		return FALSE;
	}
	
	// 非本级或上级目录,且不是文件夹
	if ( (wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY )
	{
		u64 u64Temp = wfd.nFileSizeHigh;
		u64FileSzie += ( u64Temp << 32 ) + wfd.nFileSizeLow;
	}
	
	FindClose( hFindFile );
	return TRUE;
}  

2、计算文件夹的大小

      计算文件夹的大小,就是遍历文件夹中的所有文件,将所有文件大小计算出来,累计在一起就是文件夹的大小了。可能文件夹中包含子文件夹,所以这里有个递归调用在封装的接口中,代码如下:

// 计算文件夹的大小,注意调用前请将n64FileSzie清零
BOOL CalcFileFolderSize( CString strFileDir, u64& u64FileSzie )
{
	CString  strFindFileName = strFileDir + _T("\\*.*");
	WIN32_FIND_DATA wfd;
	HANDLE hFindFile = FindFirstFile( strFindFileName, &wfd ); 
	if ( hFindFile == INVALID_HANDLE_VALUE )
	{ 
		return FALSE;
	}
	
	while ( 1 )
	{			
		// 将文件夹中的.和..过滤掉,之前仅判断wfd.cFileName[0]是否为‘.’是有问题的,
		// 比如版本控制的代码的目录下包含掩藏的.svn文件夹,会导致文件夹大小计算有误
		//(偏小)
		if ( _tcscmp( wfd.cFileName, _T(".") ) != 0 && 
			_tcscmp( wfd.cFileName, _T("..") ) != 0 )
		{// 非本级或上级目录				
			if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
			{// 目录
				// 递归
				CString strFilePath = strFileDir + _T('\\') + wfd.cFileName;
				CalcFileFolderSize( strFilePath, u64FileSzie );
			}
			else
			{// 文件
				u64 u64Temp = wfd.nFileSizeHigh;
				u64FileSzie += ( u64Temp << 32 ) + wfd.nFileSizeLow;
			}
		}
		
		if ( !FindNextFile( hFindFile, &wfd ) )
		{
			break;
		}
	};
	
	FindClose( hFindFile );
	return TRUE;
}

3、进一步封装,封装成一个统一的接口

       直接封装成一个总的接口,传入文件或文件夹路径,同时指定当前的对象是文件还是文件夹,代码如下:

// 文件类型:文件/文件夹/无效
enum EmFilePathType
{
    emInvalideType = -1, // 无效类型
    emFileFolder = 0,    // 文件夹
    emFile               // 文件
};


// 计算目标文件或文件夹的大小
BOOL CalcTargetFileSize( CString strFilePath, EmFilePathType emFileType, u64& u64FileSzie )
{
	u64FileSzie = 0;

	if ( emFileType == emInvalideType )
	{
		return FALSE;
	}
	
	if ( emFileType == emFileFolder ) // 文件夹
	{
		return CalcFileFolderSize( strFilePath, u64FileSzie );
	}
	else // 文件
	{
		return CalcFileSize( strFilePath, u64FileSzie );
	}
}

你可能感兴趣的:(VC++常用功能代码封装,文件,文件夹,计算大小)