我需要获取所有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");
答案 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");