【问题标题】:Delete file vs directory + recreate performance删除文件 vs 目录 + 重新创建性能
【发布时间】:2011-08-04 18:37:50
【问题描述】:

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

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

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

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


    【解决方案1】:

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

    在与@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();
    

    【讨论】:

    • 这是不正确的 - Directory.Delete 在带有 Win32Native.FindNextFile 的文件中递归移动。
    • 先生。 D ...您可以在网站上引用您所声称的内容吗?上次我担心直接写入时,删除目录所需要做的只是对 mft 的一次写入,并且该目录使用的所有空间都被释放。现在,如果您尝试进行安全删除,那就是另一回事了,但这里不存在该要求。
    • @Cos Callis:被引参考文献 - Reflector -> mscorlib -> System.IO.Directory.DeleteHelper。这表明目录在删除之前必须为空:msdn.microsoft.com/en-us/library/aa365488(v=vs.85).aspx
    • @Cos Callis: 另请注意,.NET 在使用文件系统时不只是写入 MFT,它使用本机 Windows 调用——它们所做的是另一回事,但在这在这种情况下,他们不会做你声称的事情,如果他们这样做了,.NET 就不会使用这种机制。
    • @MrD。感谢您的参考和 cmets。需要指出的是,调用 Directory.Delete(path) 是不够的,而调用应该是 Directory.Delete(path, true); (其中 true 用于触发目录内容的递归删除)。我仍然支持删除和重新创建更好,但我的推理是不正确的。生活和学习。
    【解决方案2】:

    我会说直接删除目录会提供最佳性能,但这是基于每个 File.Delete 调用请求权限要求的单一因素的推测,而不是使用 Directory.Delete 时的初始检查 - 有'可以肯定的是,在细节上会更加魔鬼。

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

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

    您是否对此进行了测试,以了解您的实际情况是什么样的结果?

    【讨论】:

    • 我现在无法测试 10000 个或更多文件,但是当网站准备就绪时,它会处理这么多文件,所以我需要在它上线之前知道。
    • 好吧,你最好在它上线之前测试之前。在那之前它还没有准备好。 ;)
    【解决方案3】:

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

    【讨论】:

    • 如果你删除目录,它会有很好的性能而不是你迭代所有文件并一个一个删除,目录的重新创建没什么大不了的。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 2011-11-09
        • 2014-11-16
        相关资源
        最近更新 更多