`
qzriso
  • 浏览: 242645 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

用CFileFind递归搜索目录

阅读更多

  我们知道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函数是一致的。

  有了该工具你再也不用手动清理自己机子上那一大堆的中间文件了,当你需要把自己的工程目录保存起来,以供以后查阅时,你就可以通过该工具彻底地清理一下中间文件,平时你再也不用去管那些令人讨厌的中间文件了。

分享到:
评论

相关推荐

    VC++利用CFileFind类遍历目录文件 并显示在树视图控件中 不同层级用不同的图标

    这里,我们主要关注的是如何利用CFileFind类来实现这一功能,并且在不同层级上使用不同的图标来区分目录和文件。CFileFind类是MFC(Microsoft Foundation Classes)库中提供的一种便利工具,用于搜索文件系统中的...

    双缓冲画图、FTP上传单文件及递归搜索根目录下的文件

    你可以创建CFileFind对象,使用FindFile和FindNextFile成员函数遍历目录,并通过IsDirectory判断是否为子目录,从而实现递归搜索并在树形控件(如CTreeCtrl)中显示。 文件"MemDC"可能是一个源代码文件,包含了实现...

    MFC文件递归检索

    递归检索是指从一个根目录开始,不仅搜索该目录下的文件,还深入到所有子目录中继续查找的过程。这种技术在文件备份、病毒扫描、资源管理器的目录树构建等场景中非常实用。 #### 2. **MFC中的CFileFind类** MFC框架...

    (MFC)遍历文件夹下的文件(包括子文件夹)

    本文将深入探讨如何使用MFC来遍历一个文件夹及其子文件夹中的所有文件,这在许多应用程序中都非常实用,例如文件管理和搜索功能。我们将遵循以下步骤: 1. **创建MFC应用程序** 在Visual Studio 2008中,选择...

    批量修改后缀 VC++实现 递归遍历源码

    本教程将深入探讨如何使用Microsoft Visual C++ 2005(VC++2005)来实现这一功能,同时利用MFC(Microsoft Foundation Classes)库中的CFileFind类进行目录的递归遍历。以下是对这一技术的详细解释。 首先,我们...

    C++递归删除一个目录实例

    本文实例讲述了C++递归删除一个目录的实现方法。分享给大家供大家参考。具体方法如下: CFindFile的使用框架如下: 代码如下:void Recurse(LPCTSTR pstr)  {   CFileFind finder;     // build a string with...

    MFC文件夹递归拷贝到指定路径源码

    `CFileFind`对象的`FindNextFile`方法用于在搜索结果中移动到下一个文件或目录。对于每个找到的项,检查`IsDirectory()`方法返回的结果,如果为真,则表示找到了一个目录;否则,它是一个文件。 3. **处理文件**:...

    一个CFileFind的扩展类CFileFindExtVC源代码

    作者用基于层次遍历的非递归算法(以减少运行时的时间和空间开销)实现了一个 CFileFind 的扩展类 CFileFindExt,该类可以对指定目录下的所有文件进行搜索或相同的处理操作。 关键字:filefind,file,find,文件,查找

    VC++中如何遍历整个目录树查找文件.docx

    我们也可以使用其他的函数来实现文件查找,例如使用 CFileFind 类来遍历目录树。 使用 VC++ 遍历整个目录树查找文件可以通过使用 _findfirst 和 _findnext 函数来实现,这个方法可以轻松地遍历整个目录树,查找指定...

    一个CFileFind的扩展类CFileFindExt(update)VC源代码

    作者用基于层次遍历的非递归算法(以减少运行时的时间和空间开销)实现了一个 CFileFind 的扩展类 CFileFindExt,该类可以对指定目录下的所有文件进行搜索或相同的处理操作。 关键字:filefind,file,find,文件,查找

    MFC 目录树遍历程序

    4. **使用CFileFind遍历目录**:创建一个CFileFind对象,然后使用其FindFile()和FindNextFile()方法开始遍历目录。这些方法会找到当前目录下的所有文件和子目录。 5. **将文件和目录添加到树视图**:对于每个找到的...

    MFC读取文件夹并且遍历该文件下面的所有文件

    通过创建CFileFind对象,我们可以开始搜索指定路径下的文件和目录。下面是一个简单的步骤来实现这个功能: 1. **初始化CFileFind对象**:创建一个CFileFind对象并调用其`FindFile()`方法,传入要搜索的起始路径。...

    获取文件夹的子目录的文件名

    在给定的文件列表中,我们看到有`.cpp`和`.h`文件,这表明可能是一个用C++编写的MFC项目,其中`GetSubFile`可能是主要的函数,而`GetSubFileDlg`可能是一个对话框类,用于显示子目录的文件名。 以下是使用MFC的一个...

    MFC删除非空目录

    通过上述分析可以看出,虽然MFC标准库中没有提供直接删除非空目录的函数,但通过自定义实现,结合递归思想以及`CFileFind`类的灵活运用,可以有效地解决这一问题。开发者可以根据实际情况调整和完善上述代码,以适应...

    删除目录(文件夹)

    // 使用CFileFind进行目录遍历 CFileFind finder; BOOL bFound = finder.FindFile(lpPath _T("\\*.*")); while (bFound) { bFound = finder.FindNextFile(); if (!finder.IsDots()) { // 如果是文件,...

    VC++ 遍历文件夹自动生成目录树 VC++ 遍历文件夹自动生成目录树

    在VC++编程中,遍历文件夹并自动生成目录树是一项常见的任务,它涉及到文件系统操作和数据结构的使用。这个任务通常用于构建文件管理器、进行文件搜索或实现类似资源管理器的功能。下面我们将详细讲解如何在VC++中...

    文件名查找文件路径

    总之,"文件名查找文件路径"是一个利用MFC进行文件搜索的应用程序,通过`CFileFind`类和递归遍历树形目录结构,实现对文件系统的深度搜索。开发者可以借助`FindFile.sln`和`FindFile`源代码进一步学习和理解这一功能...

    VC遍历文件夹并建成目录树.visual c++

    - 如果是目录,创建一个新的目录节点,并将该节点添加到当前目录节点,然后递归调用遍历函数进入子目录。 在VC++中,你可以使用MFC(Microsoft Foundation Classes)库来简化这一过程。MFC提供了一个名为`CFileFind...

    遍历本目录下的所有文件

    在这个示例中,`TraverseDirectory`函数接收一个目录路径,然后使用`CFileFind`开始搜索。`FindNextFile`方法用于查找下一个文件或目录。当遇到一个目录时,递归调用`TraverseDirectory`以遍历子目录。如果找到的是`...

    MFC 把一个文件夹下的制定类型文件复制到另一个文件夹下

    这个函数接受源目录、目标目录和文件类型作为参数,然后使用CFileFind遍历源目录下的文件。对于每个找到的文件,它检查文件类型,如果是所需类型,就将其复制到目标目录。 请注意,实际项目中应添加错误处理代码,...

Global site tag (gtag.js) - Google Analytics