繁体   English   中英

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

[英]Retrieve a list of filenames in folder and all subfolders quickly

我需要获取所有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> ,这允许您立即开始处理结果集(而不是等待返回整个列表)。

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

从文档:

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

怀疑你可以做多少,

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

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

我第一次建议您使用StopWatch而不是DateTime来获取经过的时间。
在第二次使搜索速度更快时,不应将GetFiles的结果存储在List中,而应直接存储到数组中。
最后,您应该优化搜索模式:您需要每个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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM