我已经见过像What is the best way to empty a directory?什么是删除目录中文件的最快方式? (除特定的文件扩展名)
问题,但我需要知道,
什么是删除所有目录中找到的文件,除非发现有任何.zip
文件的最快方式。
闻起来像linq这里......或什么?
通过说最快的方式,我的意思是最快的执行时间。
我已经见过像What is the best way to empty a directory?什么是删除目录中文件的最快方式? (除特定的文件扩展名)
问题,但我需要知道,
什么是删除所有目录中找到的文件,除非发现有任何.zip
文件的最快方式。
闻起来像linq这里......或什么?
通过说最快的方式,我的意思是最快的执行时间。
这里是普通的老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);
通过最快你要求最少的代码行或最快的执行时间?下面是一个使用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); });
如果您使用的是.NET 4,那么您可以通过智能化的方式来让.NET变得更加平滑您的功能。这段代码是禁食的方式。这也会随着处理器上的核心数量而变化。
DirectoryInfo di = new DirectoryInfo(yourDir);
var files = di.GetFiles();
files.AsParallel().Where(f => f.Extension != ".zip").ForAll((f) => f.Delete());
在写这个答案没有()使用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之间的性能差异变得更加明显。
你在做什么语言/操作系统? – Eli 2011-02-12 23:48:41
我认为C#/ LINQ标签已经足够了@Eli – Marko 2011-02-12 23:52:42
LINQ不会比任何其他方法都快;它仍然需要枚举文件。瓶颈是您的磁盘,而不是负责发送请求的代码。 – 2011-02-13 08:25:10