2011-02-12 32 views
6

我已經見過像What is the best way to empty a directory?什麼是刪除目錄中文件的最快方式? (除特定的文件擴展名)

問題,但我需要知道,

什麼是刪除所有目錄中找到的文件,除非發現有任何.zip文件的最快方式。

聞起來像linq這裏......或什麼?

通過說最快的方式,我的意思是最快的執行時間。

+0

你在做什麼語言/操作系統? – Eli 2011-02-12 23:48:41

+0

我認爲C#/ LINQ標籤已經足夠了@Eli – Marko 2011-02-12 23:52:42

+0

LINQ不會比任何其他方法都快;它仍然需要枚舉文件。瓶頸是您的磁盤,而不是負責發送請求的代碼。 – 2011-02-13 08:25:10

回答

2

這裏是普通的老C#

foreach(string file in Directory.GetFiles(Server.MapPath("~/yourdirectory"))) 
{ 
    if(Path.GetExtension(file) != ".zip") 
    { 
     File.Delete(file); 
    } 
} 

而這裏的LINQ

var files = from f in Directory.GetFiles("") 
      where Path.GetExtension(f) != ".zip" 
      select f; 

foreach(string file in files) 
    File.Delete(file); 
8

通過最快你要求最少的代碼行或最快的執行時間?下面是一個使用LINQ和每個循環並行的示例來快速刪除它們。

string[] files = System.IO.Directory.GetFiles("c:\\temp", "*.*", IO.SearchOption.TopDirectoryOnly); 

List<string> del = (
    from string s in files 
    where ! (s.EndsWith(".zip")) 
    select s).ToList(); 

Parallel.ForEach(del, (string s) => { IO.File.Delete(s); }); 
8

如果您使用的是.NET 4,那麼您可以通過智能化的方式來讓.NET變得更加平滑您的功能。這段代碼是禁食的方式。這也會隨着處理器上的核心數量而變化。

 DirectoryInfo di = new DirectoryInfo(yourDir); 
     var files = di.GetFiles(); 

     files.AsParallel().Where(f => f.Extension != ".zip").ForAll((f) => f.Delete()); 
3

在寫這個答案沒有()使用Directory.EnumerateFiles以前的答案,讓您在正在建造的名單上的文件列表上的操作進行的時間。 代碼:

Parallel.ForEach(Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories).AsParallel(), Item => 
     { 
      if(!string.Equals(Path.GetExtension(Item), ".zip",StringComparison.OrdinalIgnoreCase)) 
       File.Delete(Item); 
     }); 

據我所知使用進行AsParallel性能增益()不應該顯著(如果找到)在這種情況下,但它確實使我的情況不同。

我比較了使用1-foreach刪除包含10個zip文件的4689個文件列表中除.zip文件外的所有時間。 2平行的foreach。 3- IEnumerable的()。進行AsParallel()。的ForAll。 4-foreach使用IEnumerable()。AsParallel(),如上所示。 結果:

1-1545

2-1015

3-1103

4-839

第五和最後一種情況下是使用一個Directory.GetFiles正常的foreach( )

5-2266

當然結果並不確定,據我所知,進行適當的基準測試時,您需要使用RAM而不是HDD。

注意:隨着文件數量的增加,EnumerateFiles和GetFiles之間的性能差異變得更加明顯。

相關問題