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