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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:15:56