繁体   English   中英

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

[英]What is the fastest way of deleting files in a directory? (Except specific file extension)

我看到过诸如清空目录的最佳方法是什么之类的问题

但我需要知道,

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

闻起来像这里的 linq ......或者什么?

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

如果您正在使用 .NET 4,您可以通过 .NET 现在并行化您的功能的智能方式受益。 此代码是执行此操作的快速方法。 这也与处理器上的内核数量成比例。

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

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

您是要求最少的代码行还是最快的执行时间? 这是一个使用 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); });

在撰写此答案时,以前的答案均未使用 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。 使用 IEnumerable().AsParallel() 的 4 并行 foreach,如上所示。 结果:

1-1545

2-1015

3-1103

4-839

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

5-2266

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

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

这是普通的旧 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM