MFC递归删除文件夹
Dec 21, 2013
最近在看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专栏。有改动。