
Directory.Exists 最直接判断目录是否存在这是 C# 中最常用、最轻量的方式,不抛异常、不依赖权限检查,只查路径是否为有效目录。它返回 true 仅当该路径存在且被操作系统识别为目录(而非文件)。
Directory.Exists 对不存在的父路径不做递归验证,比如 "C:\a\b\c" 不存在,但 "C:\a" 也不存在时,它仍返回 false
*、? 或过长),会直接返回 false,不会抛 ArgumentException
FileAttributes.ReparsePoint 手动处理try/catch + Directory.GetAccessControl
单纯 Directory.Exists 无法告诉你路径是真不存在,还是因权限不足读不到。比如某目录被 ACL 完全拒绝,它就返回 false,和根本没创建过的目录表现一致。
Directory.GetAccessControl(path):成功 → 目录存在且可读元数据;抛 UnauthorizedAccessException → 很可能存在但无权访问;抛 DirectoryNotFoundException → 基本确定不存在GetAccessControl 可能抛 PlatformNotSupportedException,需先判断 OperatingSystem.IsWindows()
Exception.Message 判断错误类型,始终捕获具体异常类型ArgumentException
传给 Directory.Exists 的路径若含非法字符、为空或全是空白,.NET 会直接抛 ArgumentException,而不是返回 false —— 这容易让调用方误以为目录“不存在”,实则是参数错了。
Path.GetInvalidPathChars() 和 Path.GetInvalidFileNameChars() 辅助校验(但注意:它们不覆盖所有限制,比如 Windows 路径长度上限 260 字符)string.IsNullOrWhiteSpace(path) 排除空值,再用 Path.IsPathRooted(path) 判断是否为绝对路径(相对路径在不同工作目录下结果不稳定)Path.GetFullPath(path) 标准化后再检查,它会自动展开 ".."、"." 并检测非法结构Exists 返回 true 后立即操作仍可能失败这是一个经典的时间窗口问题:Directory.Exists 返回 true 只代表“此刻存在”,但下一毫秒它可能被其他进程删除或改名。后续的 Directory.Delete 或 Directory.CreateDirectory 仍可能抛异常。
if (Directory.Exists(p)) Directory.Delete(p); —— 应直接 try { Directory.Delete(p); } catch (DirectoryNotFoundException) { }
Directory.CreateDirectory(path),它本身是幂等的(目录已存在时不报错)FileSystemWatcher)或加锁机制,但代价高,多数情况没必要实际编码中,95% 的场景用 Directory.Exists 就够了,但得记住它不处理权限、不校验参数、也不保证后续操作安全——这些边界恰恰是线上出问题最多的地方。