2017-03-15 187 views
3

我觀察到在調用TDirectory.Delete(x)後立即調用DirectoryExists(x)返回true如果要刪除的文件夾中包含少量文件並且該文件夾已打開(在Total Commander中)。TDirectory.Delete似乎是異步的

換句話說:

begin 
    TDirectory.Delete('x', true); <-- 'Delete' exited but the folder is still not fully deleted 
    if SysUtils.DirectoryExists('x')... <-- This returns true 
end; 

這是一種正常的行爲?

的「解決方案」是這樣的:

begin 
    TDirectory.Delete('x', true); 
    Sleep(1000);   //wait for Delete to finish 
    if SysUtils.DirectoryExists('x')... 
end; 

問:我如何知道什麼時候刪除已準備好(我怎麼消除睡眠)?

注意:Total Commander不會阻止文件夾的刪除(我猜),因爲無論如何文件夾被刪除(一段時間後)。

+0

爲什麼你會在'TDirectory.Delete'之後立即調用'DirectoryExists'? –

+0

@ R.Beiboer可能檢查目錄是否已被刪除,因爲TDirectory.Delete缺少結果值。 –

+0

@ R.Beiboer:防禦性編碼,除了其他原因之外,嘗試檢查目錄是否在與其存在不一致之前檢查過。 – MartynA

回答

4

看一看的MSDN頁面約RemoveDirectory:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365488(v=vs.85).aspx

說明部分說:

的RemoveDirectory功能,標誌着在近刪除的目錄。因此,目錄不會被刪除,直到目錄的最後一個句柄被關閉。

因此可能另一個進程也有一個處理目錄(病毒掃描程序?)。

如果您需要清空目錄,請將其清空而不是刪除它,然後重新創建。最後,你總是支付一個骯髒的黑客;)

+0

可以刪除/重新創建文件夾的示例:Total Commander有一個允許您將IO操作放入隊列的功能。因此,您可以刪除一個文件夾,然後重新創建它(在已刪除文件夾的位置複製另一個具有相同名稱的舊文件)。也許還有其他情況下,您依賴於被刪除的文件夾。 – Ampere

相關問題