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在控制.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM