線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1866
推到 Plurk!
推到 Facebook!

使用DelTree()的疑問

尚未結案
look4help
一般會員


發表:9
回覆:8
積分:3
註冊:2005-07-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-15 01:09:48 IP:218.164.xxx.xxx 未訂閱
各位好,我之前在網站上找到_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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-16 17:06:40 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-17 09:31:04 IP:218.164.xxx.xxx 未訂閱
謝謝RedSnow。 請問dirLevel這個變數初始值為0麼?這個變數的用意為何呢? 我採用你修改後的函式,宣告int dirLevel=0; 不過我執行後,函式仍然只有刪除掉最低層的檔案, 其他資料夾並沒有被刪除掉。
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-17 11:28:54 IP:61.230.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-17 23:00:24 IP:218.164.xxx.xxx 未訂閱
了解了,謝謝RedSnow。
系統時間:2024-04-18 10:54:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!