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

.NET 4.8调用Directory.GetFiles访问D:\遇未授权访问异常求助

问题分析与解决方案

核心原因

.NET 4.8的Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)会强制遍历目标路径下所有层级的目录,包括系统保护的隐藏目录(如System Volume Information、回收站目录)。这类目录即便使用管理员权限,也会限制对部分子项的访问,直接触发UnauthorizedAccessException。而dir d:\命令默认会跳过这类系统保护目录的深层遍历,你的旧版本程序大概率是自行实现了递归遍历逻辑,在遇到权限异常时自动跳过,而非依赖原生API的一次性遍历。

解决方案

放弃使用SearchOption.AllDirectories,改用手动递归遍历,在遇到权限异常时跳过对应目录,示例代码如下:

public static List<string> GetAllFiles(string rootPath, string searchPattern)
{
    var fileList = new List<string>();

    try
    {
        // 添加当前目录下的匹配文件
        fileList.AddRange(Directory.GetFiles(rootPath, searchPattern));

        // 遍历子目录并递归处理
        foreach (var subDir in Directory.GetDirectories(rootPath))
        {
            try
            {
                fileList.AddRange(GetAllFiles(subDir, searchPattern));
            }
            catch (UnauthorizedAccessException)
            {
                // 跳过无权限访问的子目录
                continue;
            }
            catch (DirectoryNotFoundException)
            {
                // 处理遍历过程中被删除的目录
                continue;
            }
        }
    }
    catch (UnauthorizedAccessException)
    {
        // 根目录无权限访问,直接返回空列表
    }

    return fileList;
}

补充说明

外接USB SSD的特殊性可能加剧了这个问题:部分外接磁盘的System Volume Information目录权限配置与内置磁盘不同,或者存在第三方工具创建的特殊受限目录,但核心矛盾还是原生API的遍历逻辑差异——原生AllDirectories模式不会跳过任何目录的权限异常,而手动递归可以灵活处理这类情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:13:11