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

时间:2011-04-13 14:16:29

标签: c# .net asp.net file directory

哪种删除文件的方法效果最佳?

  • 删除每个文件,或
  • 一次删除包含文件的整个目录并重新创建目录

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

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

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

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

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

P.S。为了澄清一点,.NET没有一次删除文件夹中所有文件并离开目录的功能。

5 个答案:

答案 0 :(得分:5)

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

在与@Mr Disappointment交换之后,我会对我的回答提出以下修正:

如果你需要“经常”这样做,那么你可以自己构建一个如下所示的扩展方法:

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();

答案 1 :(得分:3)

关于性能观点,您可以删除整个目录并重新创建。在重新创建时,您只需要创建目录。

答案 2 :(得分:3)

我想说直接删除目录可以提供最佳性能,但这是基于每个File.Delete调用请求的单一权限要求的推测,而不是使用{{1}时的初始检查 - 确切地说,细节中还会有更多的恶魔。

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

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

您是否对此进行了测试,以确定在您的情况下哪种结果是现实的?

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

你肯定知道的唯一方法是去那里。所以,创建一个测试工具并去那里。

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

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

你可以用一个.net秒表课来计时。您也可以使用environment.tickcount来获取时间。