删除文件与目录+重新创建性能

问题描述 投票:0回答:6

哪种删除文件的方法性能最好?

  • 删除每个文件,或者
  • 一次性删除整个目录和文件并重新创建目录

请注意根目录必须仍然存在,所以我可以这样做:

var photo_files = Directory.EnumerateFiles(item_path, "*.jpg", SearchOption.TopDirectoryOnly);

foreach (var photo in photo_files)
{
    File.Delete(photo);
}

或者删除整个目录然后重新创建。

10000甚至100000个文件会有多少性能差异?

附注需要澄清的是,.NET 没有功能可以一次性删除文件夹中的所有文件并离开该目录。

c# .net asp.net file directory
6个回答
4
投票

当您删除一个目录时,这是对驱动器主文件表的一次写入,而如果您删除每个文件,则每个文件都有一个写入操作。因此,删除目录并重新创建它会更有效。

在与@失望先生交流后,我将对我的答案进行以下修改:

如果您需要“经常”执行此操作,那么您可以自己构建一个如下所示的扩展方法:

public static class IOExtension
   {
      public static void PurgeDirectory(this DirectoryInfo d)
      {
         string path = d.FullName;

         Directory.Delete(d.FullName,true);//Delete with recursion
         Directory.CreateDirectory(path);

      }
   }

这样您就可以在 DirectoryInfo 类上调用它,就像......

Directory Info di = new DirectoryInfo(path);
di.PurgeDirectory();

3
投票

我想说直接删除目录会提供最佳性能,但这是基于每个

File.Delete
调用请求的权限要求的单一因素的推测,而不是使用
Directory.Delete
时的初始检查 - 会有可以肯定的是,细节更复杂。

两者都循环遍历文件,最终都归结为调用本机 Windows 函数来完成工作 - 每个文件一次。

请记住,使用 IO 时最大的瓶颈实际上是正在读取或写入的磁盘硬件。

您是否对此进行过测试,看看在您的情况下实际结果是什么样的?


3
投票

从性能角度来看,您可以删除整个目录并重新创建。重新创建后只需创建目录即可。


0
投票

某处某处必须删除所有文件。如果你不直接做,那么它必须间接地为你做(比如脱壳并调用“RmDir /S”)。因此,整个系统的性能大致相同。您的应用程序的性能可能会有所不同,具体取决于您是否必须先等待所有文件被删除。


0
投票

删除目录(文件和子目录)的所有内容是最稳健的。

删除并立即重新创建目录可能不起作用。我个人对此有过疑问。 Stack Overflow 正在讨论这个问题。 使用 Directory.Delete() 和 Directory.CreateDirectory() 覆盖文件夹

我已成功在应用程序启动时删除文件夹并在单击按钮时重新创建该文件夹。基本上你必须分散删除和创建。


-1
投票

这个问题就像:“太阳中心有多热?”

您唯一能确定的方法就是去那里。因此,创建一个测试工具并前往那里。

创建一个文件夹,并将相同的图像放入该文件夹中 10000 次。使用 guid 或唯一的名称来命名该文件。您可以为此编写一个简单的程序。

然后运行删除代码并为这两种情况计时。根据需要重复以确认结果。

有一个 .net 秒表类,您可以使用它来计时。您还可以使用environment.tickcount来获取计时。

© www.soinside.com 2019 - 2024. All rights reserved.