directory适用于单次操作,directoryinfo适用于频繁操作;createdirectory失败多因非法字符、权限不足或路径含空格;delete(true)需手动清除只读属性;遍历大目录应选enumeratefiles避免内存溢出。

直接用 Directory 还是先 new DirectoryInfo,取决于你操作频次和是否需要元数据——单次判断、创建、删除就用 Directory;同一目录反复读取属性、遍历、删改,必须用 DirectoryInfo 实例,否则性能掉得明显。
Directory.CreateDirectory 为什么能自动建多级目录却总报错
Directory.CreateDirectory 确实会逐级创建父目录,但常见失败不是因为它不行,而是路径本身有问题:
- 路径含非法字符(
?、*、|、、<code>>)→ 抛ArgumentException - 权限不足(比如写入
C:\Program Files)→ 抛UnauthorizedAccessException,不是IOException - 路径末尾带空格或不可见 Unicode 字符 →
GetFullPath后仍可能被系统拒绝,建议用Path.GetFullPath(path)标准化后再传入 - 误写成
Directory.CreateDirectories(根本不存在这个方法)→ 编译直接失败
Directory.Delete(path, true) 还是删不掉非空目录
传了 true 仍失败,大概率卡在只读文件上。.NET 的 Delete(path, true) 不会自动清除子项的 ReadOnly 属性,遇到只读文件直接抛 IOException:
- 必须手动遍历所有子文件,设为
FileAttributes.Normal:foreach (var file in Directory.GetFiles(path, "*", SearchOption.AllDirectories)) { File.SetAttributes(file, FileAttributes.Normal); } - 资源管理器正打开该目录 → 抛
IOException,无法绕过,得提示用户关闭窗口 - 删之前用
Directory.Exists判断只是“锦上添花”,判断和删除之间存在竞态,不能替代异常处理
遍历大目录时 GetFiles 和 EnumerateFiles 到底怎么选
文件数超几千就别碰 Directory.GetFiles,它一次性加载全部路径进内存,容易触发 OutOfMemoryException:
-
Directory.EnumerateFiles(path)返回IEnumerable<string></string>,边迭代边读取,内存占用恒定,适合流式处理 - 需要文件大小、创建时间等元数据?
EnumerateFiles只给路径字符串,得额外调new FileInfo(path)—— 如果频繁访问属性,不如直接用new DirectoryInfo(path).GetFiles(),它返回FileInfo[]数组,属性已缓存 -
SearchOption.AllDirectories在 .NET Core 2.0+ 和 .NET 5+ 中已支持EnumerateFiles,旧框架(如 .NET Framework 4.8)仍不支持,得手写递归
最易被忽略的一点:所有遍历方法(GetFiles、EnumerateFiles、GetDirectories)都不保证顺序。按名称排序得自己加 .OrderBy(x => x),按时间排序得先获取 FileInfo 再取 LastWriteTime。











