使用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
相关产品推荐
相关产品推荐

