VC++ 删除一个文件目录下的所有文件以及目录

 1 BOOL DoRemoveDirectory(CString chrDirName);
 2 
 3 BOOL ReleaseDirectory(CString chrDirName)
 4 {
 5     BOOL bRemove = DoRemoveDirectory(chrDirName);
 6     if (bRemove)
 7         ::RemoveDirectory(chrDirName);
 8     else
 9         return FALSE;
10 
11     return TRUE;
12 
13 } //end of CIVMSvrInfo::ReleaseDirectory()
14 
15 BOOL DoRemoveDirectory(CString chrDirName)
16 {
17     CString strDirName = chrDirName;
18 
19     BOOL result;
20     HANDLE Handle;
21     WIN32_FIND_DATA fData;
22     CString strTemp;
23     DWORD errorcode;
24 
25     Handle = FindFirstFile(strDirName + "\*.*", &fData);
26 
27     if (Handle == INVALID_HANDLE_VALUE)
28         return FALSE;
29 
30     do {
31         errorcode = GetLastError();
32 
33         if ( fData.cFileName[0] == '.' )
34             continue;
35 
36         if (fData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {
37             if (strDirName[strDirName.GetLength()-1] != '\'){
38                 TCHAR chA[MAX_PATH];
39                 CString strA = strDirName+'\'+ fData.cFileName;
40                 lstrcpy(chA, strA);
41                 DoRemoveDirectory(chA);
42             }
43             else{
44                 TCHAR chB[MAX_PATH];
45                 CString strB = strDirName + fData.cFileName;
46                 lstrcpy(chB, strB);
47                 DoRemoveDirectory(chB);
48             }
49 
50             strTemp = strDirName + "\" + fData.cFileName;
51 
52             SetFileAttributes(strTemp, ~FILE_ATTRIBUTE_READONLY);
53             if (!RemoveDirectory(strTemp))
54                 result = FALSE;
55             else
56                 result = TRUE;
57         }
58         else
59         {
60             strTemp = strDirName + "\" + fData.cFileName;
61             BOOL bl = SetFileAttributes(strTemp, ~FILE_ATTRIBUTE_READONLY);
62 
63             if (!DeleteFile(strTemp))
64                 result = FALSE;
65             else
66                 result = TRUE;
67         }
68 
69     }while(FindNextFile(Handle,&fData));
70 
71     errorcode = GetLastError();
72 
73     if (errorcode == ERROR_NO_MORE_FILES)//空目录
74     {
75         ::RemoveDirectory(strDirName);
76         result = TRUE;
77     }
78 
79     if (Handle)
80         FindClose(Handle);
81 
82     return result;
83 
84 }    // end of BOOL PreRemoveDirectory(CString DirName)

在上述代码中

FindFirstFile第一个参数需要一个路径,但要写*.*,表示从所有文件中找到的第一个.但写f:或者f:双斜杠都返回无效句柄.

如果f:\1.txt 则对特定文件进行搜索,返回找到的第一个

找到的文件的文件结构被记录在WIN32_FIND_DATA结构体里

FindNextFile第一个参数是FindFirstFile的返回值,可以接着上次结果继续寻找

但注意!!!!

但一个目录的文件被搜索一遍后,FindNextFile返回的WIN32_FIND_DATA结构体将重复找到最后一个找到的文件,而不会终止.

让循环结束的方法就是找上一次的报错码,然后看有没有ERROR_NO_MORE_FILES信息发生.

hFile的有效与否个人觉得还是取决于第一次的FindFirstFile结果,本程序后半段的运行主要还是errorcode!=ERROR_NO_MORE_FILES在控制.

原文地址:https://www.cnblogs.com/chechen/p/4159027.html