未尝试打开文件却触发System.IO.IOException?求原因解析
问题描述
我运行以下代码,期望返回编号最大的子目录:
var HighestFolder = Directory.GetDirectories("U:/New/Items", "*", SearchOption.AllDirectories) .Select(x => x.Replace('\\','/')) .Where(x => x.Split('/').Length >= 5) .OrderByDescending(x => long.Parse(x.Split('/').Last())) .FirstOrDefault();
但实际抛出异常:
System.IO.IOException: The system cannot open the file: 'U:\New\Items\0\7917'
该文件夹有效且可访问,还是应用程序刚刚创建的,代码里也没有显式打开文件的逻辑,为什么会触发这个异常?
临时解决方法
改用以下代码后能正常工作,但不清楚原代码失败的原因:
var HighestFolder = Directory.GetDirectories(path) .SelectMany(x => Directory.GetDirectories(x)) .Select(x => x.Replace('\\', '/')) .Where(x =>x.Substring(path.Length).Split('/').Length>= 3) .OrderByDescending(x => long.Parse(x.Split('/').Last()));
异常原因分析
Directory.GetDirectories 传入 SearchOption.AllDirectories 时,会递归遍历目标路径下的所有子目录。这个过程中,.NET 底层会尝试打开每个目录来枚举其内容——哪怕你只是获取目录路径,系统层面也需要打开目录句柄来完成枚举操作。
你遇到的问题大概率是目录创建后还未完成文件系统的元数据同步:应用程序刚创建了U:\New\Items\0\7917这个目录,但文件系统(尤其是U:这类网络共享盘/映射存储)可能存在延迟,导致Directory.GetDirectories递归遍历到该目录时,系统层面还无法成功打开它获取元数据,从而抛出IOException。
对比临时解决方法的代码:它没有用递归枚举,而是手动分两层调用Directory.GetDirectories——相当于只遍历到二级子目录,既避免了深层递归时遇到未同步的目录,同时分步调用的间隔也给了文件系统更多时间完成元数据同步,所以不会触发异常。
额外补充几个细节:
- 网络共享目录、U盘这类存储介质的文件系统同步延迟比本地磁盘更常见。
- 递归枚举是一次性发起的,系统没有缓冲时间处理刚创建的目录;而分步调用的间隙能让系统完成元数据的写入和同步。
内容的提问来源于stack exchange,提问作者Noire Black
相关产品推荐
相关产品推荐

