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

#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) ;


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值