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

未尝试打开文件却触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:55:20