【发布时间】:2010-01-18 10:59:38
【问题描述】:
我的应用程序索引最终用户计算机上所有硬盘的内容。 我正在使用 Directory.GetFiles 和 Directory.GetDirectories 递归处理整个文件夹结构。我只索引了几个选定的文件类型(最多 10 个文件类型)。
我在分析器中看到,大部分索引时间都花在枚举文件和文件夹上 - 取决于实际索引时间高达 90% 的文件的比例。
我想让索引尽可能快。我已经优化了索引本身和索引文件的处理。
我曾考虑使用 Win32 API 调用,但实际上我在分析器中看到大部分处理时间实际上都花在了 .NET 完成的这些 API 调用上。
是否有可以从 C# 访问的(可能是低级别的)方法可以使文件/文件夹的枚举至少部分更快?
根据评论中的要求,我当前的代码(只是一个修剪了不相关部分的方案):
private IEnumerable<IndexedEntity> RecurseFolder(string indexedFolder)
{
//for a single extension:
string[] files = Directory.GetFiles(indexedFolder, extensionFilter);
foreach (string file in files)
{
yield return ProcessFile(file);
}
foreach (string directory in Directory.GetDirectories(indexedFolder))
{
//recursively process all subdirectories
foreach (var ie in RecurseFolder(directory))
{
yield return ie;
}
}
}
【问题讨论】:
-
您介意分享您现在拥有的代码吗?
-
@Bobby:我已经更新了问题
-
性能方面,“API 深度”并不重要。最重要的是递归策略,在进入子文件夹之前读取/处理当前目录中的所有文件(Mrk Gravell 正确 - 假设 GetFiles() / GetDirectories 调用确实读取所有内容,并且 GetDirectories 调用是从文件系统提供的缓存)。
-
这里提出了一种更快的方法,我会尝试:stackoverflow.com/questions/724148/… - 虽然仍然对其他选项感兴趣
-
该实现 - 在跳过 .NET 包装器的同时 - 提前进入子目录,从而保留更多状态并可能破坏缓存。不过,我对 5-10 倍的说法感到惊讶 - 请在选择之前进行测量(并仔细测量......)
标签: c# .net windows optimization filesystems