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

时间:2012-05-15 16:15:53

标签: c# winforms

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

Searching for a file with 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");

4 个答案:

答案 0 :(得分:5)

您可以使用Directory.EnumerateFiles代替GetFiles。这样做的好处是可以将文件作为IEnumerable<T>返回,这样您就可以立即开始处理结果集(而不是等待返回整个列表)。

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

来自文档:

  

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

答案 1 :(得分:2)

怀疑你可以做多少,

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

答案 2 :(得分:1)

如果您想要除making sure the Windows Indexing Service is enable on the target folders以外的完整列表,请不要这样做。您的主要延迟是从硬盘驱动器读取,并且没有优化您的C#代码将使该过程更快。您可以使用FileSystemWatcher创建自己的简单索引服务,无论添加多少文档,都可以为您提供亚秒响应时间。

答案 3 :(得分:1)

我第一次建议您使用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");