2011-02-12 31 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之间的性能差异变得更加明显。

相关问题