在MFC中没有提供API函数删除非空文件夹 A(目录),所以要想删除一个非空文件夹(目录)必须先删除里面的文件。
这里需要注意一个问题,如果非空文件夹(目录)下还有文件夹(目录)AA:
1、如果文件夹 AA是空的,那就好办,直接RemoveDirectory()搞定。
2、如果 AA不是空的呢?......如果你想得比较深一点的话,应该会想到,万一 AA还有AAA,AAA还有AAAA呢?...有点恐怖,╮(╯3╰)╭
是的,你此刻应该想到了递归吧,好的,递归先暂时不管,回到正题。
目的还是只有一个,删除非空文件夹 A!!!
既然如此,那么我们还是只好写一个小小的算法删除里面的数据噢,对的,就是你刚才想到的递归!:-)
下面是网上很流行的一个思路及其代码:(不是我写的 :-) )
1 //删除文件夹目录(非空)
2 bool DeleteDirectory(char* sDirName)
3 {
4 CFileFind tempFind;
5 char sTempFileFind[MAX_PATH] ;
6
7 sprintf(sTempFileFind,"%s\\*.*",sDirName);
8 BOOL IsFinded = tempFind.FindFile(sTempFileFind);
9 while (IsFinded)
10 {
11 IsFinded = tempFind.FindNextFile();
12
13 if (!tempFind.IsDots())
14 {
15 char sFoundFileName[MAX_PATH];
16 strcpy(sFoundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
17
18 if (tempFind.IsDirectory())
19 {
20 char sTempDir[MAX_PATH];
21 sprintf(sTempDir,"%s\\%s",sDirName,sFoundFileName);
22 DeleteDirectory(sTempDir); // 嵌套函数
23 }
24 else
25 {
26 charsTempFileName[MAX_PATH];
27 sprintf(sTempFileName,"%s\\%s",sDirName,sFoundFileName);
28 DeleteFile(sTempFileName); // DeleteFile(sTempFileName)貌似也行的
29 }
30 }
31 }
32 tempFind.Close();
33 if(!RemoveDirectory(sDirName))
34 {
35 return FALSE;
36 }
37 return TRUE;
38 }
函数说明:
1、要删除的目录通过参数char * sDirName传递进去,可以是相对路径的,比如“.\\tmp”;
2、FindFile 函数是用来查找是否在指定的目录A 下存在子文件Aa 及文件夹AA,当找到返回真;
3、FindNextFile MSDN中的返回值定义是:Nonzero indicates success. Zero indicates failure. To get extended error information, call GetLastError. If no matching files can be found, the GetLastError function returns ERROR_NO_MORE_FILES.(很多XXNextXX函数都是先要XXFirstXX一次的,这里是FindFile 算例外麽?)
4、IsDots 函数,熟悉dos 环境的童鞋都知道一个目录下存在“.”和“..”(还没想起麽?自己去输入一个“dir”命令看看就知道了),“.”代表上一层目录,“..”代表本层目录。所以呢在查找文件的时候应首先过滤掉这两个特殊目录。如果你逐步调试这个函数的时候你会发现每进一个新的目录查找都会首先多执行两次if(!tempFind.IsDots)。
5、RemoveDirectory 函数只能删除空文件夹,最后记得调用一次才能保证完成任务。
ps:我不记得代码是在哪里找的了,我在这里感谢无私的作者! :-)