【问题标题】:Fastest way to delete million of files删除数百万个文件的最快方法
【发布时间】:2023-03-22 20:25:01
【问题描述】:

我有一个相对路径的字符串列表。我还有一个字符串,其中包含这些文件的根路径。现在我像这样删除它们:

foreach (var rawDocumentPath in documents.Select(x => x.RawDocumentPath))
{
    if (string.IsNullOrEmpty(rawDocumentPath))
    {
        continue;
    }
    string fileName = Path.Combine(storagePath, rawDocumentPath);
    File.Delete(fileName);
}

问题是我为每个文件都调用Path.Combine,而且速度很慢。 如何加快此代码的速度?我无法删除整个文件夹,我无法更改当前目录(因为它会影响整个程序)...

我需要一个可以快速删除指定目录中多个文件的类。

【问题讨论】:

  • 看不到任何会减慢代码速度的东西,正常情况下文件操作的瓶颈始终是 I/O 操作。您可能会尝试在此处使用多线程,例如文档.AsParallel().ForAll()
  • @MichaelSander 我知道,但是磁盘可以批量组织删除,你知道,命令队列等等。
  • 如果你知道它是“全部”的东西,你可以做一个“*.doc”类型的方法,但是当你需要做细节时......你会受到更多的限制
  • 根据我使用 kernel32.dll 及其用于处理文件的实用程序的经验,可以加快速度。当然,如果你对非托管代码没问题。
  • 在“标准”解决方案、并行执行(或异步任务)和直接使用 Windows DLL 之间进行比较基准测试将会很有趣。你觉得 Path.Combine 比 File.Delete 慢吗?

标签: c# .net filesystems


【解决方案1】:

如果您的磁盘可以处理,并行化应该会有很大帮助:

documents.AsParallel().ForAll(
    document =>
    {
        if (!string.IsNullOrEmpty(document.RawDocumentPath))
        {
            string fileName = Path.Combine(storagePath, document.RawDocumentPath);
            File.Delete(fileName);
        }
    });

【讨论】:

  • 好吧,ForAll + 本机 FileDelete 似乎是这里的答案。有趣,有人投了反对票,但没有写为什么:) 有些人真的很奇怪......
猜你喜欢
  • 2023-03-09
  • 2015-06-02
  • 2012-01-07
  • 1970-01-01
  • 2019-02-15
  • 2019-07-12
  • 1970-01-01
  • 2016-05-25
  • 2019-03-25
相关资源
最近更新 更多