2011-04-13 48 views
6

刪除文件的哪種方法具有最佳性能?刪除文件vs目錄+重新創建表現

  • 每個文件刪除,或
  • 在刪除整個目錄中的文件一次,並且重新創建目錄

只是要注意的根目錄必須是仍然存在,所以無論是我可以做的:

var photo_files = Directory.EnumerateFiles(item_path, "*.jpg", SearchOption.TopDirectoryOnly); 

foreach (var photo in photo_files) 
{ 
    File.Delete(photo); 
} 

或刪除整個目錄然後重新創建。

10000或甚至100000個文件會有多大的性能差異?

P.S.只是爲了澄清,.NET沒有功能一次刪除文件夾中的所有文件並離開目錄。

回答

5

當你刪除一個目錄時,它是對驅動器主文件表的一次寫入,而如果你刪除了每個文件,那麼每個文件都有一個寫操作。因此刪除該目錄並重新創建它會更高效。

在與@Mr失望的交流我要提出以下修改我的回答:

如果你需要做這個「很多」,那麼你可能建立自己看起來像這樣的擴展方法:

public static class IOExtension 
    { 
     public static void PurgeDirectory(this DirectoryInfo d) 
     { 
     string path = d.FullName; 

     Directory.Delete(d.FullName,true);//Delete with recursion 
     Directory.CreateDirectory(path); 

     } 
    } 

,這樣你可以調用這個對DirectoryInfo類像...

Directory Info di = new DirectoryInfo(path); 
di.PurgeDirectory(); 
+1

這是不正確的 - 「Directory.Delete」遞歸地通過具有'Win32Native.FindNextFile'的文件移動。 – 2011-04-13 14:27:33

+0

所以它是一樣的?沒有性能改變? – Programista 2011-04-13 14:36:15

+0

D先生...您可以提供您所聲稱的內容嗎?上次我擔心直接寫入操作需要做的是刪除一個目錄,只需要一次寫入mft,目錄所用的所有空間都被釋放。現在,如果您嘗試進行安全刪除是另一回事,但此要求不在此處。 – 2011-04-13 14:49:35

3

關於性能的觀點,您可以刪除整個目錄並重新創建。重新創建時,您只需創建目錄。

+0

這很明顯,但我要求一些性能提示。 – Programista 2011-04-13 14:38:03

+0

如果刪除目錄,它會有很好的性能,而不是迭代所有的文件並逐個刪除,重新創建目錄並不是什麼大問題。 – 2011-04-13 14:39:27

0

事端g,某處必須刪除所有文件。如果你不直接這樣做,那麼它必須間接完成(例如脫殼並調用「RmDir/S」)。所以,整個系統的性能大致相同。您的應用程序的性能可能會有所不同,具體取決於您是否必須等待首先刪除所有文件。

3

我會說直接刪除目錄會給出最好的性能,但這是基於每個File.Delete調用所請求的權限要求的單因子的推測,而不是使用Directory.Delete時的初始檢查 - 將會有偶數可以肯定的是,細節中有更多的惡魔。

兩者都循環遍歷文件,最終歸結爲調用本地Windows函數來完成作業 - 每個文件一次。

請記住,使用IO時遇到的最大瓶頸實際上是正在讀取或寫入磁盤的硬件。

你有沒有測試過,看看你的情況是什麼樣的結果是現實的?

+0

我現在無法對10000個或更多文件進行測試,但是當網站準備就緒時,它將處理這些數量的文件,因此我需要知道這些文件將在活動之前進行處理。 – Programista 2011-04-13 14:33:51

+3

好吧,你最好該死的**測試**它在它上線之前。直到那時還沒有準備好。 ;) – 2011-04-13 14:40:13

-1

這個問題就像是:「太陽的中心有多熱?」

你肯定知道的唯一方法就是去那裏。所以,創建一個測試工具並去那裏。

創建一個文件夾並將相同的圖像放在文件夾中10000次。用guid或獨特的東西命名文件。你可以爲此寫一個簡單的程序。

然後運行刪除代碼併爲兩種情況計時。根據需要重複以確認結果。

有一個.net秒錶類可以用來計時。您也可以使用environment.tickcount來獲取時間。

相關問題