You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Directory.EnumerateDirectories匹配后停止遍历子目录?

解决网络驱动器目录搜索效率问题:匹配后停止遍历子目录

你的核心问题在于Directory.EnumerateDirectories的SearchOption.AllDirectories会强制遍历所有层级的子目录,哪怕已经找到符合规则的目标目录,仍会继续遍历其下的所有子目录——这在网络驱动器上会产生大量无意义的IO操作,直接导致耗时剧增。

优化方案:自定义递归遍历逻辑

我们可以手动实现递归遍历,当检测到当前目录匹配规则时,直接跳过其子目录的遍历,转而继续同级目录的搜索。同时优化搜索模式,提升前期过滤效率。

步骤1:调整搜索模式

你当前用的*.*搜索模式没必要,它会过滤掉不带点的目录名(虽然你的目标目录都带点,但用*能匹配所有目录,避免不必要的前置过滤,反而更高效)。

步骤2:实现自定义遍历方法

static readonly Regex RegexValidDir = new(@"[0-9]{4,}\.[0-9]+$");

public static IEnumerable<string> EnumerateTargetDirectories(string startDir)
{
    // 遍历当前目录的直接子目录
    foreach (var dir in Directory.EnumerateDirectories(startDir, "*"))
    {
        var dirName = Path.GetFileName(dir);
        // 检查当前目录是否匹配规则
        if (RegexValidDir.IsMatch(dirName))
        {
            // 匹配成功,返回该目录,且不遍历其子目录
            yield return dir;
            continue;
        }
        
        // 不匹配则递归遍历其子目录
        try
        {
            foreach (var subDir in EnumerateTargetDirectories(dir))
            {
                yield return subDir;
            }
        }
        catch (UnauthorizedAccessException)
        {
            // 跳过无权限访问的目录,避免程序崩溃
            continue;
        }
        catch (DirectoryNotFoundException)
        {
            // 跳过已被删除的目录
            continue;
        }
    }
}

步骤3:调用自定义方法

替换原来的代码:

var dirs = EnumerateTargetDirectories(startDir);

为什么这样更快?

以你的目录结构为例:

  • 遍历到a\b\20220902.1时,检测到匹配规则,直接返回该目录,不会再遍历其下的c\d子目录
  • 只有不匹配的目录(比如a\b\x)才会继续递归遍历其子目录,彻底避免了无意义的深层IO操作

额外优化建议

  • 正则表达式你已经用了static readonly提前编译,这很好,避免了重复编译的开销
  • 如果网络延迟极高,可考虑测试并行遍历,但要注意目录遍历的线程安全,避免IO风暴导致的反效果,建议先验证串行版本的提升后再尝试

内容的提问来源于stack exchange,提问作者BenHero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:10:25