我们知道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函数是一致的。
有了该工具你再也不用手动清理自己机子上那一大堆的中间文件了,当你需要把自己的工程目录保存起来,以供以后查阅时,你就可以通过该工具彻底地清理一下中间文件,平时你再也不用去管那些令人讨厌的中间文件了。
分享到:
相关推荐
这里,我们主要关注的是如何利用CFileFind类来实现这一功能,并且在不同层级上使用不同的图标来区分目录和文件。CFileFind类是MFC(Microsoft Foundation Classes)库中提供的一种便利工具,用于搜索文件系统中的...
你可以创建CFileFind对象,使用FindFile和FindNextFile成员函数遍历目录,并通过IsDirectory判断是否为子目录,从而实现递归搜索并在树形控件(如CTreeCtrl)中显示。 文件"MemDC"可能是一个源代码文件,包含了实现...
递归检索是指从一个根目录开始,不仅搜索该目录下的文件,还深入到所有子目录中继续查找的过程。这种技术在文件备份、病毒扫描、资源管理器的目录树构建等场景中非常实用。 #### 2. **MFC中的CFileFind类** MFC框架...
本文将深入探讨如何使用MFC来遍历一个文件夹及其子文件夹中的所有文件,这在许多应用程序中都非常实用,例如文件管理和搜索功能。我们将遵循以下步骤: 1. **创建MFC应用程序** 在Visual Studio 2008中,选择...
本教程将深入探讨如何使用Microsoft Visual C++ 2005(VC++2005)来实现这一功能,同时利用MFC(Microsoft Foundation Classes)库中的CFileFind类进行目录的递归遍历。以下是对这一技术的详细解释。 首先,我们...
本文实例讲述了C++递归删除一个目录的实现方法。分享给大家供大家参考。具体方法如下: CFindFile的使用框架如下: 代码如下:void Recurse(LPCTSTR pstr) { CFileFind finder; // build a string with...
`CFileFind`对象的`FindNextFile`方法用于在搜索结果中移动到下一个文件或目录。对于每个找到的项,检查`IsDirectory()`方法返回的结果,如果为真,则表示找到了一个目录;否则,它是一个文件。 3. **处理文件**:...
作者用基于层次遍历的非递归算法(以减少运行时的时间和空间开销)实现了一个 CFileFind 的扩展类 CFileFindExt,该类可以对指定目录下的所有文件进行搜索或相同的处理操作。 关键字:filefind,file,find,文件,查找
我们也可以使用其他的函数来实现文件查找,例如使用 CFileFind 类来遍历目录树。 使用 VC++ 遍历整个目录树查找文件可以通过使用 _findfirst 和 _findnext 函数来实现,这个方法可以轻松地遍历整个目录树,查找指定...
作者用基于层次遍历的非递归算法(以减少运行时的时间和空间开销)实现了一个 CFileFind 的扩展类 CFileFindExt,该类可以对指定目录下的所有文件进行搜索或相同的处理操作。 关键字:filefind,file,find,文件,查找
4. **使用CFileFind遍历目录**:创建一个CFileFind对象,然后使用其FindFile()和FindNextFile()方法开始遍历目录。这些方法会找到当前目录下的所有文件和子目录。 5. **将文件和目录添加到树视图**:对于每个找到的...
通过创建CFileFind对象,我们可以开始搜索指定路径下的文件和目录。下面是一个简单的步骤来实现这个功能: 1. **初始化CFileFind对象**:创建一个CFileFind对象并调用其`FindFile()`方法,传入要搜索的起始路径。...
在给定的文件列表中,我们看到有`.cpp`和`.h`文件,这表明可能是一个用C++编写的MFC项目,其中`GetSubFile`可能是主要的函数,而`GetSubFileDlg`可能是一个对话框类,用于显示子目录的文件名。 以下是使用MFC的一个...
通过上述分析可以看出,虽然MFC标准库中没有提供直接删除非空目录的函数,但通过自定义实现,结合递归思想以及`CFileFind`类的灵活运用,可以有效地解决这一问题。开发者可以根据实际情况调整和完善上述代码,以适应...
// 使用CFileFind进行目录遍历 CFileFind finder; BOOL bFound = finder.FindFile(lpPath _T("\\*.*")); while (bFound) { bFound = finder.FindNextFile(); if (!finder.IsDots()) { // 如果是文件,...
在VC++编程中,遍历文件夹并自动生成目录树是一项常见的任务,它涉及到文件系统操作和数据结构的使用。这个任务通常用于构建文件管理器、进行文件搜索或实现类似资源管理器的功能。下面我们将详细讲解如何在VC++中...
总之,"文件名查找文件路径"是一个利用MFC进行文件搜索的应用程序,通过`CFileFind`类和递归遍历树形目录结构,实现对文件系统的深度搜索。开发者可以借助`FindFile.sln`和`FindFile`源代码进一步学习和理解这一功能...
- 如果是目录,创建一个新的目录节点,并将该节点添加到当前目录节点,然后递归调用遍历函数进入子目录。 在VC++中,你可以使用MFC(Microsoft Foundation Classes)库来简化这一过程。MFC提供了一个名为`CFileFind...
在这个示例中,`TraverseDirectory`函数接收一个目录路径,然后使用`CFileFind`开始搜索。`FindNextFile`方法用于查找下一个文件或目录。当遇到一个目录时,递归调用`TraverseDirectory`以遍历子目录。如果找到的是`...
这个函数接受源目录、目标目录和文件类型作为参数,然后使用CFileFind遍历源目录下的文件。对于每个找到的文件,它检查文件类型,如果是所需类型,就将其复制到目标目录。 请注意,实际项目中应添加错误处理代码,...