class CCaculateFileSize
{
public:
CCaculateFileSize(void);
public:
~CCaculateFileSize(void);
public:
void CaculateDitrctorySize(CString strDirctoyPath ,long &size) ;
void CaculateSingleFileSize(CString strFileName ,long &size) ;
void CaculateFileCount ( CString strDirectory,long &count ) ;
void CacilateZipFileCount ( CString strZipFile,long &count) ;
};
函数的具体实现如下:
#include "StdAfx.h"
#include "CaculateFileSize.h"
CCaculateFileSize::CCaculateFileSize(void)
{
}
CCaculateFileSize::~CCaculateFileSize(void)
{
}
void CCaculateFileSize::CaculateDitrctorySize(CString strDirctoyPath ,long &size) //计算一个文件目录的大小。strDirctoyPath 是目录的路径名。
{
CFileFind ff ;//一个CFileFind的对象
CString szDir = strDirctoyPath;
if(szDir.Right(1)!= "\\")
{
szDir += "\\" ;
}
szDir += "*.*" ;//"*.*可以表示一个文件夹下的所有文件
BOOL res = ff.FindFile(szDir) ;
while(res)
{
res = ff.FindNextFile() ;
if(ff.IsDirectory() && !ff.IsDots())///如果是一个子目录,用递归继续往深一层找,IsDots判断是否为点--这个要说明一下,用过Dos的话,就应该知道,每个目录//下都有缺省的两个目录,名称分别为 '. '和 '.. ',分别代表上一层目录和本层目录。因此,当我们在遍历目录下文件时,需要过滤掉这两个缺省目录。
{
CString strPath = ff.GetFilePath();
CaculateDitrctorySize( strPath ,size) ;
}
else if(!ff.IsDirectory() && !ff.IsDots())
{
//显示当前访问的文件(完整路径)
CString strPath = ff.GetFilePath();
HANDLE hFile=CreateFile( strPath,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); //This function creates, opens, or truncates a file可以创建,打开或者裁断一个文件
size = size + nFileSize ;
}
}
}
void CCaculateFileSize::CaculateSingleFileSize(CString strFileName , long &size)
{
HANDLE hFile=CreateFile( strFileName,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
long nFileSize=GetFileSize(hFile,NULL);
size = nFileSize ;
}
void CCaculateFileSize::CaculateFileCount ( CString strDirectory,long &count )
{
CFileFind ff ;
CString szDir = strDirectory ;
if(szDir.Right(1)!= "\\")
{
szDir += "\\" ;
}
szDir += "*.*" ;
BOOL res = ff.FindFile(szDir) ;
if(res == 0)//说明是单个文件
{
count += 1;
}
while(res)
{
res = ff.FindNextFile() ;
if(ff.IsDirectory() && !ff.IsDots())///如果是一个子目录,用递归继续往深一层找
{
CString strPath = ff.GetFilePath();
CaculateFileCount( strPath ,count) ;
}
else if(!ff.IsDirectory() && !ff.IsDots())
{
//显示当前访问的文件(完整路径)
count ++ ;
}
}
}
void CCaculateFileSize::CacilateZipFileCount ( CString strZipFile,long &count)
{
HZIP hz; //Zip文件句柄
ZIPENTRY ze ;
hz = OpenZip( strZipFile ,0) ;
if(hz == 0)
{
AfxMessageBox("打开ZIP文件失败") ;
return ;
}
GetZipItem(hz,-1,&ze) ;
count += ze.index;
CloseZip(hz) ;
}