資料夾刪除問題 |
尚未結案
|
yachu721
初階會員 發表:51 回覆:98 積分:44 註冊:2003-07-13 發送簡訊給我 |
目前使用ShellTreeView元件
想要刪除整個資料夾
包含資料夾內的檔案和資料夾
使用ShellTreeView1->Path來取得路徑
但卻沒有辦法刪除是哪出了錯呢~~~
void __fastcall TForm1::_DelTree(String ASourceDir) { TSearchRec SearchRec; String Sour=ASourceDir; if (Sour.SubString(Sour.Length(),1)!="\\") Sour=Sour "\\"; if (!DirectoryExists(Sour)) // 要 #include "FileCtrl.hpp" 才有這個函式 { ShowMessage("來源目錄不存在!!"); return; } if (FindFirst(Sour "*.*", faAnyFile, SearchRec) == 0) { do { //應該可用 if ((SearchRec.Attr & faDirectory) != 0) 取代下面的判斷 if ( (SearchRec.Attr == (faDirectory)) || (SearchRec.Attr == (faDirectory | faArchive)) || (SearchRec.Attr == (faDirectory | faReadOnly)) || (SearchRec.Attr == (faDirectory | faHidden)) ) { if ((SearchRec.Name!=".") && (SearchRec.Name!="..")) { _DelTree(Sour SearchRec.Name); //遞迴呼叫 FileSetAttr(Sour SearchRec.Name,faArchive); RemoveDir(Sour SearchRec.Name); } } else { FileSetAttr(Sour SearchRec.Name,faArchive); DeleteFile(Sour SearchRec.Name); } } while (FindNext(SearchRec) == 0); FindClose(SearchRec); } FileSetAttr(Sour,faArchive); RemoveDir(Sour); } //--------------------------------------------------------------------------- void __fastcall TForm1::N10Click(TObject *Sender) { _DelTree(ShellTreeView1->Path); } }發表人 - yachu721 於 2005/07/06 22:05:08 發表人 - yachu721 於 2005/07/06 23:48:32 |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
|
yachu721
初階會員 發表:51 回覆:98 積分:44 註冊:2003-07-13 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 謝謝Andy Chang大大的回答~~ 在ShellTreeView上有刪除了資料夾 但是實際上windows還是沒有刪除耶.. 我要windoes都刪除但是都試不出來.. 想了兩天...還是忍不住上來問了...哈 yachu721:奇怪我試你的程式可以!? 那你試試我的副程式,比你嚴謹,因為有時可能windows上權限或保護問題! bool DeleteDirectoryEx(const AnsiString &P); void __fastcall TForm1::Button1Click(TObject *Sender) { if(DeleteDirectoryEx(ShellTreeView1->Path)) { ShowMessage("刪除目錄成功!!"); ShellTreeView1->Items->Delete(ShellTreeView1->Selected); } else { ShowMessage("刪除目錄失敗!!"); } } bool DeleteDirectoryEx(const AnsiString &P) { if(P.IsEmpty() || P.Length()<4) return false; // 參數長度必須大於3,即不能為磁片根目錄或空白 int len=P.Length(); char *Path=P.c_str(); AnsiString Dir=Path; if(Path[len-1]!='\\') Dir=Dir '\\'; AnsiString Files=Dir "*.*"; WIN32_FIND_DATA wfd; HANDLE hFind=FindFirstFile(Files.c_str(),&wfd); bool Ret=true; AnsiString Tmp; if(hFind!=INVALID_HANDLE_VALUE) { bool bFind=true; while(bFind) { if(wfd.cFileName[0]!='.') { Tmp=Dir wfd.cFileName; if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 刪除所有子目錄 Ret=Ret && DeleteDirectoryEx(Tmp); } else { // 刪除所有文件 SetFileAttributes(Tmp.c_str(),FILE_ATTRIBUTE_NORMAL); Ret=Ret&&DeleteFile(Tmp.c_str()); } } bFind=FindNextFile(hFind,&wfd); } FindClose(hFind); } if(Ret) return RemoveDirectory(Path); return false; } 請參考!Andy Chang
------
Andy Chang |
yachu721
初階會員 發表:51 回覆:98 積分:44 註冊:2003-07-13 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 謝謝Andy Chang大大的回答 開了一個新的檔案 真的可以耶~~~ 但是為何之前的程式為何不行呢???? 一個屬性一個屬性慢慢對 找到了為何不能刪除檔案的原因了 就是只要和ShellListView屬性有設定ShellListView1 就是會出問題~~~ 要如何修改呢.... 是將ShellListView1 disable呢???????yachu721:你什麼時候又多出一個ShellListView?並且 就是只要和ShellListView屬性有設定ShellListView1 就是會出問題~~~ 我直接先舉一實例,你使用BCB開一專案存入一目錄中,關閉專案!但不要 結束BCB,開檔案總管,刪除該目錄,保證你目錄裡檔案都沒了,但該目錄 就是刪不掉,關掉BCB,等到BCB於工作列的ICON沒有,你再次刪除目錄就OK! 以上道理與你的狀況相同,有人使用的目錄不得刪除! 請參考 Andy Chang
------
Andy Chang |
yachu721
初階會員 發表:51 回覆:98 積分:44 註冊:2003-07-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |