Directory是静态类,不可实例化;创建失败主因是非法字符、权限不足、路径含不可见字符或方法名错误;删除非空目录需手动清除只读属性;遍历大目录应选EnumerateFiles避免内存溢出;频繁访问元数据宜用DirectoryInfo。

直接用 Directory 就行,别 new 它——它是个静态类,根本不能实例化。
Directory.CreateDirectory 为什么创建失败?
它确实能自动建多级目录,但失败几乎从不是“功能不行”,而是路径本身有问题:
-
ArgumentException:路径含?、*、|、、<code>>等非法字符 -
UnauthorizedAccessException:权限不足(比如往C:\Program Files写),注意这不是IOException - 路径末尾有不可见空格或 Unicode 零宽字符:建议先用
Path.GetFullPath(path)标准化再传入 - 手误写成
Directory.CreateDirectories:编译直接报错,不存在这个方法
Directory.Delete(path, true) 还是删不掉非空目录?
传了 true 仍失败,八成卡在只读文件上。.NET 不会自动清除子项的 ReadOnly 属性:
- 必须手动遍历所有子文件,设为
FileAttributes.Normal:
foreach (var file in Directory.GetFiles(path, "*", SearchOption.AllDirectories))
{
File.SetAttributes(file, FileAttributes.Normal);
}
IOException,无法绕过,得提示用户关闭窗口Directory.Exists 删前判断只是“锦上添花”,判断和删除之间存在竞态,不能替代 try/catch
遍历大目录时 GetFiles 和 EnumerateFiles 怎么选?
文件数超几千就别碰 Directory.GetFiles,它一次性加载全部路径进内存,容易触发 OutOfMemoryException:
-
Directory.EnumerateFiles(path)返回IEnumerable<string>,边迭代边读取,内存占用恒定 - 需要文件大小、创建时间等元数据?
EnumerateFiles只给路径字符串,得额外调new FileInfo(path) - 如果频繁访问属性,不如用
new DirectoryInfo(path).GetFiles(),它返回FileInfo[],属性已缓存 -
SearchOption.AllDirectories在 .NET Core 2.0+ 和 .NET 5+ 中已支持EnumerateFiles;旧框架(如 .NET Framework 4.8)仍不支持,得手写递归
DirectoryInfo 不是“更高级的 Directory”,而是针对同一目录反复操作的性能优化方案——单次判断、创建、删除,用静态 Directory 最省事;一旦要遍历 + 获取属性 + 删除 + 移动,就该立刻切到 DirectoryInfo 实例,否则路径解析开销会悄悄拖慢整个流程。


















