C#扫描本地驱动器根目录查找指定文件的异常处理问题求助
解决驱动器根目录递归扫描文件时的异常问题
原代码的核心问题是使用Directory.GetFiles(..., SearchOption.AllDirectories)时,只要扫描过程中遇到权限不足、目录不可访问的情况(比如回收站、系统保护目录),就会直接抛出异常,导致整个驱动器的扫描被中断并跳过。要解决这个问题,需要手动实现递归遍历,遇到单个目录异常时跳过该目录,继续处理其他目录。
改进后的代码
private string FindFile(string fileName) { var foundFiles = new List<string>(); foreach (DriveInfo drive in DriveInfo.GetDrives().Where(d => d.IsReady)) { UpdateStatus($"Searching {drive.RootDirectory.FullName}"); SearchDirectory(drive.RootDirectory.FullName, fileName, foundFiles); // 找到第一个匹配文件就返回,无需继续扫描 if (foundFiles.Count > 0) { return foundFiles.First(); } } return "Not Found"; } private void SearchDirectory(string directoryPath, string fileName, List<string> foundFiles) { try { // 先扫描当前目录下的文件 foreach (string file in Directory.GetFiles(directoryPath, fileName)) { foundFiles.Add(file); // 找到就提前返回,避免多余扫描 if (foundFiles.Count > 0) { return; } } // 递归扫描子目录 foreach (string subDir in Directory.GetDirectories(directoryPath)) { SearchDirectory(subDir, fileName, foundFiles); // 找到就提前返回 if (foundFiles.Count > 0) { return; } } } catch (UnauthorizedAccessException) { // 跳过无权限访问的目录 return; } catch (DirectoryNotFoundException) { // 跳过已被删除或不存在的目录 return; } catch (IOException) { // 跳过IO异常的目录(比如正在被使用的目录) return; } }
关键改进点
- 手动递归遍历目录,替代
SearchOption.AllDirectories,单个目录的异常不会影响整个驱动器的扫描 - 针对性捕获常见异常(权限不足、目录不存在、IO异常),跳过异常目录继续扫描其他目录
- 加入提前终止逻辑,找到第一个匹配文件后立即返回,提升扫描效率
- 避免空catch块,明确捕获需要处理的异常类型,防止隐藏其他未知问题
内容的提问来源于stack exchange,提问作者Jimmyeao
相关产品推荐
相关产品推荐

