删除目录中文件的最快方法是什么? (特定文件扩展名除外)

时间:2011-02-12 23:46:39

标签: c# .net vb.net linq delete-file

我见过像What is the best way to empty a directory?

这样的问题

但我需要知道,

除了找到的.zip个文件外,删除目录中找到的所有文件的最快方法是什么。

在这里闻到linq ......还是什么?

以最快的方式说,我的意思是最快的执行时间。

4 个答案:

答案 0 :(得分:10)

如果您使用的是.NET 4,那么您可以通过智能方式实现.NET功能的平衡。这段代码是禁食的方式。这也与处理器上的核心数量相称。

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

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

答案 1 :(得分: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); });

答案 2 :(得分:5)

在撰写此答案时,以前的答案都没有使用Directory.EnumerateFiles(),它允许您在构造列表时对文件列表进行操作。 代码:

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

据我所知,在这种情况下使用AsParallel()的性能提升不应该是显着的(如果找到的话),但它在我的情况下确实有所不同。

我比较了在4689个文件列表中删除所有.zip文件所需的时间,其中10个是使用1-foreach的zip文件。 2平行的foreach。 3- IEnumerable的()。进行AsParallel()。的ForAll。 4-parallel foreach使用IEnumerable()。AsParallel()如上图所示。 结果:

1-1545

2-1015

3-1103

4-839

第五个也是最后一个案例是使用Directory.GetFiles()

的普通foreach

5-2266

当然结果并不是决定性的,据我所知,要进行适当的基准测试,您需要使用ram驱动器而不是HDD。

注意:随着文件数量的增加,EnumerateFiles和GetFiles之间的性能差异变得更加明显。

答案 3 :(得分: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);