Directory.CreateDirectory 会自动处理已存在目录
调用
Directory.CreateDirectory创建文件夹时,即使目标路径已存在,它也不会报错,而是直接返回已有
DirectoryInfo对象。这点和
mkdir命令或某些脚本语言行为不同——你不需要提前用
Directory.Exists判断再分支处理。
常见误操作是写成:
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
这多了一次磁盘查询,纯属冗余。直接调用
Directory.CreateDirectory(path)即可。
路径中父目录不存在时会递归创建
Directory.CreateDirectory的关键特性是「自动创建完整路径链」。比如
"C:\A\B\C\D"全不存在,它会逐级建好 A、B、C、D 四层。
注意点:
路径必须是合法的本地路径或 UNC 路径(如"\\server\share\dir"),不支持相对路径带
..的复杂跳转(如
"..\..\out")除非当前工作目录明确 如果中间某级是只读文件夹(罕见但可能),创建会失败并抛出
UnauthorizedAccessException路径末尾加不加
\都可以,.NET 内部会标准化
权限不足或盘符不存在时的典型错误
运行时最常遇到两类异常:
UnauthorizedAccessException:当前用户对目标驱动器或父目录无写入权限(尤其在
C:Program Files或系统保护路径下)
IOException:盘符不存在(如
"Z:\myfolder"但 Z 盘未映射)、路径含非法字符(
, |, *, ?等)、或长度超 260 字符(旧版 Windows 默认限制)
建议做法:
捕获具体异常类型,而非泛泛的Exception对用户提示时,把
path变量值也打出来,方便排查是哪一级出问题 若需长路径支持,确保项目启用
longPathAware=true并使用 .NET Core 3.1+ 或 .NET 5+
需要判断是否真正新建了目录?用 DirectoryInfo.Exists 配合时间戳
有时业务逻辑依赖“本次是否首次创建”,而
Directory.CreateDirectory不提供布尔返回值。可行方案是创建后检查
LastWriteTimeUtc是否接近当前时间(误差几秒内),或更稳妥地:先调用
Directory.Exists记录状态,再创建,最后比对。
示例逻辑:
bool wasNew = !Directory.Exists(path);
Directory.CreateDirectory(path);
if (wasNew)
{
// 执行初始化操作,如写入默认配置文件
}
注意:不要依赖
Directory.GetCreationTime,NTFS 下该时间可能被复制/移动操作重置,不可靠。
真正容易被忽略的是跨网络路径的延迟和权限继承细节——比如在 SMB 共享上创建目录,实际生效可能滞后,且子目录默认继承父级 ACL,未必符合预期。这类场景建议加上日志记录和简易验证(如立刻尝试写入一个临时文件)。
