gpt4 book ai didi

c# - 递归处理文件夹中文件的快速(低级)方法

转载 作者:可可西里 更新时间:2023-11-01 14:16:01 29 4
gpt4 key购买 nike

我的应用程序索引最终用户计算机上所有硬盘驱动器的内容。我正在使用 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;
}
}
}

最佳答案

在 .NET 4.0 中,有内置的 enumerable file listing methods ;因为这不远,我会尝试使用它。如果您有大量填充的任何文件夹(需要大数组分配),这可能是一个特别的因素。

如果深度 是问题所在,我会考虑将您的方法扁平化以使用本地堆栈/队列和单个 迭代器 block 。这将减少用于枚举深层文件夹的代码路径:

    private static IEnumerable<string> WalkFiles(string path, string filter)
{
var pending = new Queue<string>();
pending.Enqueue(path);
string[] tmp;
while (pending.Count > 0)
{
path = pending.Dequeue();
tmp = Directory.GetFiles(path, filter);
for(int i = 0 ; i < tmp.Length ; i++) {
yield return tmp[i];
}
tmp = Directory.GetDirectories(path);
for (int i = 0; i < tmp.Length; i++) {
pending.Enqueue(tmp[i]);
}
}
}

迭代,根据结果创建您的 ProcessFile

关于c# - 递归处理文件夹中文件的快速(低级)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2085452/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com