快速检索文件夹和所有子文件夹中的文件名列表

本文关键字:文件夹 文件名 列表 检索 | 更新日期: 2023-09-27 18:34:18

我需要获取所有Word文档的列表。 *.doc 和 *.docx 存储在基于 Windows 的文件夹中,有许多子文件夹和子子文件夹等...

使用 C# 搜索文件有一个有效的答案,它已有 2 年的历史,搜索 10 个文件需要 1500 秒(将来可能会有 10,000 个或更多)。 我将发布我的代码,它基本上是上述链接的副本。 有人有更好的解决方案吗?

DateTime dt = DateTime.Now;
DirectoryInfo dir = new DirectoryInfo(MainFolder);
List<FileInfo> matches = 
          new List<FileInfo>(dir.GetFiles("*.doc*",SearchOption.AllDirectories));
TimeSpan ts = DateTime.Now-dt;
MessageBox.Show(matches.Count + " matches in " + ts.TotalSeconds + " seconds");

快速检索文件夹和所有子文件夹中的文件名列表

您可以使用

Directory.EnumerateFiles 而不是 GetFiles 。 这样做的优点是将文件作为IEnumerable<T>返回,这允许您立即开始处理结果集(而不是等待返回整个列表)。

如果您只是计算文件数量或列出所有文件,则可能无济于事。 但是,如果您可以对结果进行处理和/或过滤,特别是如果您可以在其他线程中执行任何操作,则速度会快得多。

从文档中:

枚举文件和 GetFiles 方法的区别如下:使用 EnumerateFiles 时,可以在返回整个集合之前开始枚举名称集合;使用 GetFiles 时,必须等待返回整个名称数组,然后才能访问数组。因此,当您处理许多文件和目录时,枚举文件可以更有效。

怀疑你能用它做很多事情,

dir.GetFiles("*.doc|*.docx", SearchOptions.AllDirectories)可能会产生影响,因为它是更严格的模式。

如果你想要完整的列表,除了确保在目标文件夹上启用Windows索引服务,不是真的。您的主要延迟将从硬盘驱动器读取,并且不优化 C# 代码会使该过程更快。您可以创建自己的简单索引服务,也许使用 FileSystemWatcher,无论添加多少文档,它都会为您提供亚秒级响应时间。

第一次,我建议您使用秒表而不是日期时间来获取经过的时间。
为了加快搜索速度,您不应该将 GetFiles 的结果存储在列表中,而应该直接存储在数组中。
最后,你应该优化你的搜索模式:你想要每个doc和docx文件,试试"*.doc?
这是我的建议:

var sw = new Stopwatch();
sw.Start();
var matches = Directory.GetFiles(MainFolder, "*.doc?", SearchOption.AllDirectories);
sw.Stop();
MessageBox.Show(matches.Length + " matches in " + sw.Elapsed.TotalSeconds + " seconds");