如何MFC实现计算一个文件夹的大小

来源:互联网 发布:制作图片音乐的软件 编辑:程序博客网 时间:2024/05/16 17:10
#pragma once../////头文件
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的话,就应该知道,每个目录//下都有缺省的两个目录,名称分别为 '. '和 '.. ',分别代表上一层目录和本层目录。因此,当我们在遍历目录下文件时,需要过滤掉这两个缺省目录。

  //所以由CFileFind对象引用IsDots的意思是:这是一个目录并且不是这个目录本身或者上层目录。
{
 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可以创建,打开或者裁断一个文件


long nFileSize=GetFileSize(hFile,NULL);//GetFileSize获得文件大小。
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) ;


}

原创粉丝点击