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

使用SearchOption.AllDirectories时Directory.GetFiles无返回值问题咨询

问题原因

Directory.GetDirectories和Directory.GetFiles传入SearchOption.AllDirectories时,会递归遍历所有子目录,只要遍历过程中碰到任意一个无权限访问的目录,整个方法会直接抛出UnauthorizedAccessException,终止整个搜索过程,已经扫描到的符合条件的结果也不会返回。你将整个搜索逻辑包裹在一个try-catch中,捕获异常后直接中断了所有处理,自然无法拿到任何返回结果。

解决方法

不要直接使用SearchOption.AllDirectories做全局扫描,改为自行实现递归遍历逻辑,针对单个目录做异常捕获,碰到无权限的目录直接跳过,不影响其他目录的扫描,示例代码如下:

// 定义存储结果的列表
List<string> found_directories = new List<string>();
List<string> found_files = new List<string>();

// 递归搜索方法
void SearchDirectory(string currentPath, string searchPrefix)
{
    try
    {
        // 遍历当前目录下匹配前缀的子文件夹
        foreach (string dir in Directory.GetDirectories(currentPath, $"{searchPrefix}*", SearchOption.TopDirectoryOnly))
        {
            Console.WriteLine(dir);
            found_directories.Add(dir);
            // 递归遍历子文件夹内部
            SearchDirectory(dir, searchPrefix);
        }

        // 遍历当前目录下匹配前缀的文件
        foreach (string file in Directory.GetFiles(currentPath, $"{searchPrefix}*", SearchOption.TopDirectoryOnly))
        {
            Console.WriteLine(file);
            found_files.Add(file);
        }
    }
    catch (UnauthorizedAccessException)
    {
        // 跳过无权限访问的目录,不中断整体搜索
        return;
    }
    catch (DirectoryNotFoundException)
    {
        // 跳过遍历过程中被删除的目录
        return;
    }
}

// 调用方法,传入用户输入的根路径和匹配前缀
SearchDirectory(path, param);

额外排查点

  • 确认用户输入的path路径有效且存在,路径如果包含转义字符建议使用@"C:\xxx"格式的逐字字符串避免解析错误
  • 确认param参数没有包含*/?等特殊通配符,避免匹配逻辑不符合预期
  • 如需区分大小写匹配,可以在获取到文件/文件夹名称后自行做字符串对比,无需使用自带的通配符匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:45:03