複製整個 Directory 及刪除整個 Directory 兩個函式! |
|
Dalman
一般會員 發表:27 回覆:22 積分:24 註冊:2002-08-21 發送簡訊給我 |
‧因專案上需要做整個目錄操作緣故,因此撰寫及測試過這個兩個函式。
‧若各位大大用過 Win32 APIs SHFileOperation() 函式來複製整個目錄會
出現目錄檔案莫名地無法複製情況時,也請使用這兩個函式代替使用。
//---------------------------------------------------------------------------- uses SysUtils; //【函式作用】複製整個目錄至指定路徑內。 //【輸入引數】 // vSrcPath 來源目錄路徑。 // vDestPath 目的目錄路徑。 // [vOverwrite] 選擇性引數,遇到相同檔名檔案存在時是否要覆寫,{true→覆寫|false→不覆寫}。@=true。 //【函式傳回】Boolean,{true→執行成功|false→執行失敗}。 //【作者版本】Dalman, 2002/10/09, 1.0.0。 function _CopyDir(const vSrcPath, vDestPath: AnsiString; vOverwrite: Boolean=true): Boolean; var r: TSearchRec; s, d: AnsiString; ns, nd: AnsiString; begin try try result := false; s := IncludeTrailingPathDelimiter(vSrcPath); d := IncludeTrailingPathDelimiter(vDestPath); if not ForceDirectories(d) then Exit; //若目的目錄無法建立時,則... //---- 開始遞回搜尋複製目錄及檔案群 ------------------------------------ if FindFirst(s '*.*', faAnyFile, r) = 0 then begin repeat if (r.Name <> '.') and (r.Name <> '..') then begin ns := s r.Name; //新來源目錄路徑或檔案名稱。 nd := d r.Name; //新目的目錄路徑或檔案名稱。 if (r.Attr and faDirectory) = faDirectory then begin //若為目錄時,則... if not ForceDirectories(nd) then Exit; //嚐試建立目的目錄。 CopyDir(ns, nd); //再找下一層子目錄複製。 end else begin if FileExists(nd) and (not vOverwrite) then Continue; //若目的檔案存在且又不覆寫時,則... if not CopyFile(PChar(ns), PChar(nd), false) then Exit; end; end; until FindNext(r) <> 0; result := true; end; except on e: Exception do result := false; end; finally FindClose(r); end; end; //---------------------------------------------------------------------------- //【函式作用】刪除整個目錄。 //【輸入引數】 // vDirPath 來源目錄路徑。 // [vForced] 選擇性引數,{true→徹底刪除整個目錄|false→若遇唯讀檔案時則略過刪除}。@=true。 //【函式傳回】Boolean,{true→執行成功|false→執行失敗}。 //【函式說明】 // 一、請小心使用此函式,目錄一經刪除則無法救回! // 二、此函式無法刪除下列目錄或檔案: // ‧已經有使用者網路連線使用的共用目錄。(尚未有連線的共用目錄則可刪除) // ‧屬性設定為「faSysFile(系統檔案)」的目錄或檔案。 //【作者版本】Dalman, 2002/10/09, 1.0.0。 function _DeleteDir(const vDirPath: AnsiString; vForced: Boolean=true): Boolean; var r: TSearchRec; d, nd: AnsiString; begin try result := true; d := IncludeTrailingPathDelimiter(vDirPath); if DirectoryExists(d) then begin //若指定目錄存在時,則... //---- 開始遞回搜尋刪除目錄及檔案群 ------------------------------------ if FindFirst(d '*.*', faAnyFile, r) = 0 then begin repeat if (r.Name <> '.') and (r.Name <> '..') then begin nd := d r.Name; //新目的目錄路徑或檔案名稱。 if vForced then FileSetAttr(nd, r.Attr and (not faReadOnly)); //若強迫刪除時,則先將檔案唯讀屬性取消。 if (r.Attr and faDirectory) = faDirectory then //若為目錄時,則... DeleteDir(nd, vForced) else begin DeleteFile(PChar(nd)); end; end; until FindNext(r) <> 0; end; FindClose(r); if vForced then FileSetAttr(d, FileGetAttr(d) and (not faReadOnly)); //若強迫刪除時,則先將目錄唯讀屬性取消。 result := RemoveDir(d); //試著刪除目錄本身並傳回結果。 end; except on e: Exception do begin result := false; FindClose(r); end; end; end;【使用範例】 _CopyDir('C:\Program Files', 'C:\Temp'); _DeleteDir('C:\Temp', false); |
kkccgg
初階會員 發表:50 回覆:54 積分:30 註冊:2002-07-28 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
在 Delphi 7 下 Compile 產生下面錯誤 [Warning] Unit1.pas(8): Unit 'FileCtrl' is specific to a platform
[Error] Unit1.pas(57): Undeclared identifier: 'CopyDir'
[Warning] Unit1.pas(100): Symbol 'FileSetAttr' is specific to a platform
[Warning] Unit1.pas(100): Symbol 'faReadOnly' is specific to a platform
[Error] Unit1.pas(102): Undeclared identifier: 'DeleteDir'
[Warning] Unit1.pas(110): Symbol 'FileSetAttr' is specific to a platform
[Warning] Unit1.pas(110): Symbol 'FileGetAttr' is specific to a platform
[Warning] Unit1.pas(110): Symbol 'faReadOnly' is specific to a platform
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
zombit
初階會員 發表:63 回覆:39 積分:30 註冊:2004-05-11 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |