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

