Directory类不可实例化,所有方法均为静态;CreateDirectory自动创建嵌套目录且静默处理已存在情况;Delete需显式传true删除非空目录;EnumerateFiles内存友好但需手动获取文件属性;路径拼接必须用Path.Combine并配合GetFullPath规范化。

Directory 类本身不能实例化,所有方法都是静态的——直接用 Directory 调用就行,别写 new Directory(),那会编译报错。
创建目录:用 Directory.CreateDirectory,不是 CreateDirectoryInfo
创建单层或嵌套路径都用 Directory.CreateDirectory。它会自动逐级创建不存在的父目录,比如 Directory.CreateDirectory(@"C:c"),即使 a 和 b 不存在也会成功。
- 如果目录已存在,该方法不抛异常,也不覆盖,只是静默返回已存在的
DirectoryInfo对象(可忽略) - 路径末尾加不加反斜杠
都行,@"C: mp"和@"C: mp"效果一致 - 不要用
Directory.CreateDirectories(根本不存在这个方法),那是常见拼写错误 - 权限不足时抛
UnauthorizedAccessException,不是IOException;路径含非法字符(如? * |)则抛ArgumentException
删除目录:区分 Delete 和 Delete(true)
Directory.Delete(path) 只删空目录;想删非空目录,必须显式传 true:Directory.Delete(path, true)。漏掉 true 会导致 IOException:“目录不是空的”。
- 递归删除不跳过只读文件——如果子文件是只读的,
Delete(path, true)仍会失败,得先遍历设FileAttributes.Normal - 删除正在被其他进程占用的目录(比如资源管理器正打开该文件夹),会抛
IOException,无法绕过 - 路径不存在时抛
DirectoryNotFoundException,建议删之前用Directory.Exists判断,但注意:判断和删除之间存在竞态(目录可能被别人新建或删掉)
遍历目录:别直接用 GetFiles 处理大目录
Directory.GetFiles(path) 和 GetDirectories 会一次性把所有匹配项加载进内存,路径下有几万文件时容易触发 OutOfMemoryException 或明显卡顿。
- 替代方案是用
Directory.EnumerateFiles(path)——它返回IEnumerable,延迟执行,边迭代边读取,内存友好 - 搜索模式如
"*.log"两者都支持,但EnumerateFiles不支持SearchOption.AllDirectories的重载(.NET Core 2.0+ 和 .NET 5+ 已支持) - 若需获取文件属性(大小、时间等),
EnumerateFiles返回的是路径字符串,还得额外调用new FileInfo(path);而DirectoryInfo.GetFiles()直接返回FileInfo[]数组,适合小目录且需要元数据的场景 - 注意:所有遍历方法都不保证顺序,如需按名称排序,得自己
.OrderBy(x => x)
路径拼接别用 + 或 @"" 拼字符串
硬拼路径极易出错:"C:data" + "logs" 在 Linux 上跑不通,@"C:data" + "sub" 多个反斜杠可能被误解析。一律用 Path.Combine。
-
Path.Combine("C:\data", "logs", "app.log")→"C:\data\logs\app.log"(自动补反斜杠,跨平台安全) -
Path.Combine("C:/data", "logs")在 Windows 下也会转成反斜杠,无需手动替换 - 拼接后建议用
Path.GetFullPath规范化,比如处理".."或多余".":Path.GetFullPath(@"C:..")→"C:\b" - 绝对路径传给
Path.Combine时,前面部分会被丢弃——Path.Combine("C:\a", "D:\b")结果是"D:\b",这点常被忽略
真正麻烦的不是 API 调用本身,而是路径合法性校验、权限边界、并发访问和长路径(>260 字符)——Windows 默认限制下,Directory.GetFiles 可能静默跳过超长路径项,连异常都不抛。开启长路径支持(注册表或 app.manifest)后,还得确认运行时是 .NET Core 3.1+ 或 .NET 5+,旧版依然无效。











