使用DelTree()的疑問 |
尚未結案
|
look4help
一般會員 發表:9 回覆:8 積分:3 註冊:2005-07-26 發送簡訊給我 |
各位好,我之前在網站上找到_DelTree()的函式,並且把它應用在我的程式中。
可是我發現我在使用上,沒有如我預期,不知道是哪邊出了問題。
例如,我要刪除的資料夾位置為C:\AAA\BBB\CCC
可是每次執行_DelTree(C:\AAA)之後,結果都是只有刪除掉CCC以下的檔案,以及CCC的資料夾而已,
而C:\AAA\BBB等路竟還存在。是否我的用法錯誤? 因為我是直接取_DelTree()函式,將它改寫為使用Win API,以下為我的Code,請各位指點一下,我是哪邊用錯了,謝謝各位。
extern bool _DeleteTree(WideString deleteDir) { bool Result=true; WideString Sour; WIN32_FIND_DATAW FindFileData; HANDLE handFile; int isDeleteOK=1; //此值若為0表示失敗,否則為成功。 try { Sour = deleteDir; if (Sour.SubString(Sour.Length(),1)!=WideString("\\")) Sour = Sour "\\"; //判斷來源目錄是否存在 if (FindFirstFileW(deleteDir,&FindFileData)==INVALID_HANDLE_VALUE) { ShowMessage("Source direction : " deleteDir " does not exist."); Result = false; Abort(); } handFile = FindFirstFileW(Sour "*.*",&FindFileData); if (FindFirstFileW(Sour "*.*",&FindFileData)!=INVALID_HANDLE_VALUE) { do { if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0 ) { if (WideString(FindFileData.cFileName)!=WideString(".")&& WideString(FindFileData.cFileName)!=WideString("..")) { _DeleteTree(Sour FindFileData.cFileName); SetFileAttributesW(Sour FindFileData.cFileName,FILE_ATTRIBUTE_ARCHIVE); isDeleteOK = RemoveDirectoryW(Sour FindFileData.cFileName); } } else { SetFileAttributesW(Sour FindFileData.cFileName,FILE_ATTRIBUTE_ARCHIVE); DeleteFileW(Sour FindFileData.cFileName); } } while(FindNextFileW(handFile,&FindFileData)); FindClose(handFile); } SetFileAttributesW(Sour,FILE_ATTRIBUTE_ARCHIVE); isDeleteOK = RemoveDirectoryW(Sour); } __finally { return Result; } }發表人 - look4help 於 2005/10/15 01:11:44 發表人 - look4help 於 2005/10/15 01:28:37 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
look4help 您好: 我將您的程式修改如下,測試結果是 OK 的,您參考一下吧:
extern bool _DeleteTree(AnsiString deleteDir) { bool Result = true; WideString Sour; WIN32_FIND_DATAW FindFileData; HANDLE handFile; int isDeleteOK = 1; //此值若為0表示失敗,否則為成功。 try { Sour = deleteDir; if (Sour.SubString(Sour.Length(),1) != WideString("\\")) Sour = Sour "\\"; handFile = FindFirstFileW(Sour "*.*", &FindFileData); if (handFile == INVALID_HANDLE_VALUE) { ShowMessage("Source direction : " deleteDir " does not exist."); Result = false; } else { do { if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0 ) { if (WideString(FindFileData.cFileName) != WideString(".")&& WideString(FindFileData.cFileName) != WideString("..")) { dirLevel ; _DeleteTree(Sour FindFileData.cFileName); dirLevel--; SetFileAttributesW(Sour FindFileData.cFileName, FILE_ATTRIBUTE_ARCHIVE); isDeleteOK = RemoveDirectoryW(Sour FindFileData.cFileName); } } else { SetFileAttributesW(Sour FindFileData.cFileName, FILE_ATTRIBUTE_ARCHIVE); DeleteFileW(Sour FindFileData.cFileName); } } while(FindNextFileW(handFile, &FindFileData)); FindClose(handFile); if (dirLevel == 0) { SetFileAttributesW(Sour,FILE_ATTRIBUTE_ARCHIVE); isDeleteOK = RemoveDirectoryW(Sour); } } } __finally { return Result; } }7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/10/16 17:07:50 |
look4help
一般會員 發表:9 回覆:8 積分:3 註冊:2005-07-26 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
look4help 您好: 您在刪除目錄時,該目錄及其下層目錄不可以是在開啟狀態,也就是不可以有任何程式正在使用該目錄,以您舉的例子而言,如果您開了個 DOS Box 並使用 cd 指令切換目錄到 C:\AAA\BBB 這個目錄,那麼您在執行前述的刪除程序時,就僅能將目錄內的檔案刪除掉,並且移除掉 C:\AAA\BBB\CCC 這個下層目錄,作用中的 C:\AAA\BBB 這層目錄,以及其上層目錄都被系統鎖定不能被刪除,除非您在執行刪除動作前,將作用目錄由 C:\AAA\BBB 轉移至 C:\ (或其它目錄),否則不能刪除掉 C:\AAA\BBB 及其上層目錄的現象是正常的。 如果上述的 "作用中目錄" 是在 C:\AAA 這個目錄的話,那就會變成 C:\AAA\BBB\CCC 及 C:\AAA\BBB 目錄都可刪除,但是 C:\AAA 目錄是無法刪除的。 這種現象會發生在任何有使用到目錄的程式,包含檔案總管以及您自己寫的程式,如果在檔案總管開啟了 C:\AAA\BBB 目錄,那麼執行刪除目錄的動作後,您會發現結果和前述的第一個例子是一樣的。 7 天天敲鍵盤 v 時時按滑鼠 8
|
look4help
一般會員 發表:9 回覆:8 積分:3 註冊:2005-07-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |