全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3330
推到 Plurk!
推到 Facebook!

資料夾刪除問題

尚未結案
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-06 21:58:32 IP:59.104.xxx.xxx 未訂閱
目前使用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-07 00:51:33 IP:221.169.xxx.xxx 未訂閱
yachu721:    void __fastcall TForm1::N10Click(TObject *Sender)
{
  _DelTree(ShellTreeView1->Path);
  ShellTreeView1->Items->Delete(ShellTreeView1->Selected);
}
加紅字那一行!
請參考!    
Andy Chang
------
Andy Chang
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-07 18:43:49 IP:59.104.xxx.xxx 未訂閱
謝謝Andy Chang大大的回答~~ 在ShellTreeView上有刪除了資料夾 但是實際上windows還是沒有刪除耶.. 我要windoes都刪除但是都試不出來.. 想了兩天...還是忍不住上來問了...哈
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-07 22:18:39 IP:221.169.xxx.xxx 未訂閱
引言: 謝謝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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-08 00:50:59 IP:59.104.xxx.xxx 未訂閱
謝謝Andy Chang大大的回答 開了一個新的檔案 真的可以耶~~~ 但是為何之前的程式為何不行呢???? 一個屬性一個屬性慢慢對 找到了為何不能刪除檔案的原因了 就是只要和ShellListView屬性有設定ShellListView1 就是會出問題~~~ 要如何修改呢.... 是將ShellListView1 disable呢???????
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-08 10:15:44 IP:221.169.xxx.xxx 未訂閱
引言: 謝謝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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-08 19:33:05 IP:59.104.xxx.xxx 未訂閱
原來如此 謝謝andychang1690大大詳細的解答 真是麻煩您了~~ 那看來要用其他方式來寫了~~呵呵
系統時間:2024-05-02 14:44:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!