我们知道CFileFind未提供直接遍历其子目录的功能,而有时候我们却常常要遍历某一目录下的所有文件及其子目录。如我们要删除一个目录,而这个目录下又有子目录,因为Windows不允许删除非空的目录,因此我们必须能够遍历一个目录下的所有子目录,这可以通过简单的递归实现.
下面让我们从一个简单的例子开始:如何删除某一目录?(假设我们通过DeleteDirectory(LPCTSTR DirName)函数完成这一功能)
要删除一个目录,我们要完成下面几步:
1. 删除该目录下的所有文件
2. 如果该目录中还有子目录我们要递归地调用DeleteDirectory(LPCTSTR DirName)函数,以删除该子目录下的所有文件
3. 调用RemoveDirectory(LPCTSTR lpPathName)删除该目录
DeleteDirectory(LPCTSTR DirName)函数的完整实现如下: BOOL DeleteDirectory(LPCTSTR DirName) { CFileFind tempFind; file://声明一个CFileFind类变量,以用来搜索 char tempFileFind[200]; file://用于定义搜索格式 sprintf(tempFileFind,"%s\\*.*",DirName); file://匹配格式为*.*,即该目录下的所有文件
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind); file://查找第一个文件 while(IsFinded) { IsFinded=(BOOL)tempFind.FindNextFile(); file://递归搜索其他的文件 if(!tempFind.IsDots()) file://如果不是"."目录 { char foundFileName[200]; strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200)); if(tempFind.IsDirectory()) file://如果是目录,则递归地调用 { file://DeleteDirectory char tempDir[200]; sprintf(tempDir,"%s\\%s",DirName,foundFileName); DeleteDirectory(tempDir); } else { file://如果是文件则直接删除之 char tempFileName[200]; sprintf(tempFileName,"%s\\%s",DirName,foundFileName); DeleteFile(tempFileName); } } } tempFind.Close(); if(!RemoveDirectory(DirName)) file://删除目录 { AfxMessageBox("删除目录失败!",MB_OK); return FALSE; } return TRUE; }
|
通过上面的例子,详细读者已学会了如何递归遍历某一目录下的所有文件及子目录了。实际上利用这一点可以作出非常有用的工具。下面我给大家举个小例子。
用VC编写程序的时候,VC会生成一大堆的中间文件,这些中间文件的体积十分庞大,一般比我们编写的代码要大出10倍以上。当我们想要把我们编写的源代码保留起来,以供以后查阅时,我们不得不手动删除这些中间文件,而有些时候,你想查看以前某个工程的运行结果,于是你编译该工程,经常这样做的话,如果你不删除VC生成的中间文件,你的硬盘很快就会被一大堆的中间文件塞满。于是我编写了一个VC的中间文件清理工具。其原理非常简单:
首先,让用户指定一个需要清理的目录,然后我们通过CFileFind递归地遍历该目录,查找目录名为Debug和Release的目录(这是VC默认的输出目录,如果你更改了缺省设置的话,必须手动删除之),然后调用上面我们编写的DeleteDirectory函数删除之。
警告:使用该工具时,一定要确保你的工程没有叫Debug或Release的,而且你的有用的目录名也不能是Debug或Release,否则,使用本工具会全部把它们删掉的。
另外,本工具也能统计源程序的规模(给出整个工程的行数、c文件数、h文件数和cpp文件数及总的文件数目),你可以用它方便地统计出自己源程序的规模。统计源程序规模的原理也是递归地查找某一目录,其原理和上面讲的DeleteDirestory函数是一致的。
有了该工具你再也不用手动清理自己机子上那一大堆的中间文件了,当你需要把自己的工程目录保存起来,以供以后查阅时,你就可以通过该工具彻底地清理一下中间文件,平时你再也不用去管那些令人讨厌的中间文件了。
分享到:
相关推荐
目录树遍历顾名思义就是把目录树中所有的目录及文件依次查找一遍,WINDOWS里的文件查找程序和 SafeClean Utilities(环保卫士)等都用到了目录树遍历。我们当然也可以在自己的程序中加入这一功能。 下面就是该算法的...
自己做的VC++小程序,利用CFileFind类遍历目录文件 并显示在树视图控件中 不同层级用不同的图标
功能: CFolderContent类搜索一个目录, 列出该目录下的所有目录名称,列出所有子目录下的文件名称等属性。 作者: jef 作者邮箱: dungeonsnd@126.com 发步时间: 20100311 版本: v1.1 版权: 请遵循GNU. 对外接口: ...
功能:实现文件后缀名批量处理 开发环境:VC++2005 开发 其它:利用CFileFind递归遍历目录,提供了[浏览]对话框接口类
CFileFind的派生类 支持正则表达式
CFileFind类的主要成员函数演示,帮助初学者掌握CFileFind函数的使用方法。
由于wince不支持MFC的CFileFind,本封装根据网上资料,修改了一些错误,基本用法和CFileFind一样。已经用在我的Wince6、Wince7的项目中。
WINCE 下面不能使用MFC自带的 CFileFind 类,这是某个牛人专为WINCE写的CFileFind类,和MFC下的这个类用法一样。
本文实例讲述了C++递归删除一个目录的实现方法。分享给大家供大家参考。具体方法如下: CFindFile的使用框架如下: 代码如下:void Recurse(LPCTSTR pstr) { CFileFind finder; // build a string with...
mp3fileinfo.rar 读取Mp3文件头部和尾部的信息.doc 如何用C++解析出wav文件的信息.doc mp3fileinfo.rar MP3FileInfo - Extract Header and ID3 Tags of an MP3 File.doc
作者用基于层次遍历的非递归算法(以减少运行时的时间和空间开销)实现了一个 CFileFind 的扩展类 CFileFindExt,该类可以对指定目录下的所有文件进行搜索或相同的处理操作。 关键字:filefind,file,find,文件,查找
(1) 代码接口和CFileFind一样,所以如果原来有搜索单一目录的程序,现在要把下 面的子目录也搜索,那么只需要把原来的CFileFind改成CFileFindAll就可以了 (当然要包含FileFindAll头文件了)。 这样就不用大段的改...
作者用基于层次遍历的非递归算法(以减少运行时的时间和空间开销)实现了一个 CFileFind 的扩展类 CFileFindExt,该类可以对指定目录下的所有文件进行搜索或相同的处理操作。 关键字:filefind,file,find,文件,查找
基于vc++搜索目录下所有文件.Treeview
商业编程-源码-一个CFileFind的扩展类CFileFindExt(update).zip
用于清理过期的文件,可设置文件的保存时间
vc中如何查找指定目录如D: Program Files目录下是否有某个文件夹如MyGame 只要找到是否有MyGame这个文件夹就好了 不需要查找内部文件 我现在想做的主要是在C盘和D盘的Program Files文件夹下查找是否有MyGame这个...
CFileFind find; CString strTemp = strPath; BOOL bFind; if ( strTemp[strTemp.GetLength()-1] == '\\' ) strTemp += "*.*"; else strTemp += "\\*.*"; bFind = find.FindFile( strTemp ); ...
复制某一给定目录下的文件 void FileCopyTo(CString source, CString destination, CString searchStr, BOOL cover = TRUE) { CString strSourcePath = source; CString strDesPath = destination; CString ...
1.常用的find方式遍历 2.使用CFindFile简洁遍历 3.将需要便利到的所以文件路径都保留在一个CStringArray 变量下。