2009-10-19 40 views
1
遞歸地刪除文件

我使用下面的代碼刪除大量文件獲得Windows的ShFileOperation「API Delphi中

function FastDelete(const fromDir: string): Boolean; 
var 
    fos: TSHFileOpStruct; 
begin 
    ZeroMemory(@fos, SizeOf(fos)); 
    with fos do 
    begin 
    wFunc := FO_DELETE; 
    fFlags := FOF_FILESONLY or 
       FOF_NOCONFIRMATION or 
       FOF_NO_CONNECTED_ELEMENTS or 
       FOF_NOERRORUI or 
       FOF_NO_UI; 
    pFrom := PChar(fromDir+'\*.*' + #0); 
    end; 
    Result := (0 = ShFileOperation(fos)); 
end; 

我如何得到它遞歸刪除路徑中的所有文件?

MSDN documentation

編輯

的問題是FOF_FILESONLY標誌 取出文件被刪除遞歸

回答

4

MSDN documentation後:

FOF_NORECURSION

只在本地目錄執行操作。不要遞歸地操作到子目錄,這是默認行爲

看起來這就是您的答案。它應該自動遞歸,除非你不要求它。

編輯:看起來像你的國旗有問題。你需要將它們放在一起,而不是將它們加在一起。由於FOF_NO_UI已包含FOF_NOERRORUI,因此再次添加它可能會更改該值,並且您可能會不小心將某些內容添加到了一起,這些內容總計爲FOF_NORECURSION。它應該看起來像這樣:

fFlags := FOF_FILESONLY or 
       FOF_NOCONFIRMATION or 
       FOF_NO_CONNECTED_ELEMENTS or 
       FOF_NOERRORUI or 
       FOF_NO_UI; 
+0

嗨梅森 - 我不使用FOF_NORECURSION我應該如何更改我的代碼,使其遞歸刪除子目錄中的文件? – 2009-10-19 22:21:27

+0

它應該在默認情況下遞歸執行。檢查我的編輯。 – 2009-10-19 23:29:14

+0

此外,如果您要刪除整個目錄,則不確定是否需要'\ *。*'掩碼。傳遞函數目錄本身應該足夠 – EagleOfToledo 2009-10-20 00:28:27

1

您是否還需要保持目錄?如果沒有,你可以只通過

pFrom := PChar(fromDir+#0); 

另一種選擇是打造#0分隔的文件路徑的列表,並傳遞一個額外#0,從msdn

雖然這個成員被聲明爲以空字符結尾的字符串,它被用作緩衝區以保存多個文件名。每個文件名必須由一個NULL字符終止。額外的NULL字符必須附加到最終名稱的末尾以指示pFrom的結尾。