MFC递归删除文件夹

MFC递归删除文件夹

Dec 21, 2013
Coding
MFC, Windows, C++

最近在看MFC 的文件操作,从网上淘了一本比较讲MFC文件操作比较全的电子书,然后开始试手。在删除文件夹时,遇到了问题,通过查看MSDN和网友的论坛留言,自己总算是解决了这个问题,现在与大家共享。

MFC中提供了删除文件夹的一个封装函数 RemoveDirectory()

BOOL WINAPI RemoveDirectory(
  _In_  LPCTSTR lpPathName
);

只要把要删除的文件夹的路径传进去就可以删除了,貌似一切如此简单。我象征性的建立一个文件夹,然后在程序中删除了它,okay,一下就成功了。正当我要转手去做另外的操作时,喜欢乱尝试的毛病就鬼使神差的让我做了这么一件事,在这个文件夹下我添加了几个新的子文件夹以及一些文件,再试我的程序,出问题了,删不掉了!

原来RemoveDirectory()欺骗了我,它只能删除空的文件夹,这下就有问题了,如何才能删除一个文件夹,即便其中含有无数的子文件和子文件夹?

递归删除 #

RemoveDirectory() 的这种行为其实是情有可原的,它为我们的操作提供了一种安全级别的控制。 但如果要删除非空文件夹 , 如何操作?答案是

递归删除

递归,现将其所有子文件和子文件夹删除,在将其删除,问题解决。

实现代码

void myCleanDirectory(CString directory_path) //删除一个文件夹下的所有内容(清空文件夹)
{
   CFileFind finder;
   CString path;
   path.Format("%s/*.*",directory_path);
   BOOL bWorking = finder.FindFile(path);
   while(bWorking){
     bWorking = finder.FindNextFile();
     if(finder.IsDirectory() && !finder.IsDots()){//处理文件夹
       myCleanDirectory(finder.GetFilePath()); //递归清空该文件夹
       RemoveDirectory(finder.GetFilePath());
     }
     else{//处理文件
       DeleteFile(finder.GetFilePath());
     }
   }
}

首先定义一个CFileFind对象finder

CFileFind: Performs local file searches and is the base class for CGopherFileFind and CFtpFileFind, which perform Internet file searches.

执行本地文件查找,也是CGopherFileFind 和 CFtpFile(实现网络文件查找的对象)的基类。

设置要查找的文件名path为当前文件夹directory_path下的所有文件,包括文件夹(.)。执行FindFile()搜索,

FindFile(): Call this member function to open a search

调用该函数,打开一个搜索。查找成功返回非0值,查找失败返回0。FindFile()调用后,在调用其他文件属性函数前,必须至少调用一次FindNextFile函数。 bWorking非0时,表示查找成功,调用FindNextFile来获得查找结果序列中的下一个(第一次调用时返回序列的第一个)。然后,判断查找到的是文件还是文件夹,如果是文件,则直接删除;如果是文件夹,则递归调用myCleanDirectory()删除其子文件和子文件夹,再将其删除。

测试 #

为了测试myCleanDirectory函数,可以新建一个MFC工程,再新建一个测试文件夹ForVcTest,在文件夹中添加各种子文件和子文件夹,在工程中加入下面的代码

void DeleteAllDirectory() //删除文件夹 包括非空的文件夹
{
    //第一步 清空文件夹,删除该文件夹下所有文件
    myCleanDirectory("C:/ForVcTest");

    //第二步 删除该空文件夹
    RemoveDirectory("C:/ForVcTest");
}

执行代码,一个内容丰富的文件夹就消失了。成功。


该文2010-08-01 16:50首发于我的CSDN专栏。有改动。