directory.createdirectory 会静默处理已存在目录并递归创建完整路径链,无需预先检查存在性;支持unc路径但不推荐复杂相对路径;需捕获unauthorizedaccessexception和ioexception等具体异常;判断是否新建需结合directory.exists状态比对。

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 或系统保护路径下)
拍客竞拍系统是一款免费竞拍网站建设软件,任何个人可以下载使用,但未经商业授权不能进行商业活动,程序源代码开源,任何个人和企业可以进行二次开发,但不能以出售和盈利为目的。安装方法,将www文件夹里面的所有文件上传至虚拟主机,在浏览器执行http://你的域名/install.php或者直接导入数据库文件执行。本次升级优化了一下内容1,程序和模板完美分离。2,优化了安装文件。3,后台增加模板切换功能。
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,未必符合预期。这类场景建议加上日志记录和简易验证(如立刻尝试写入一个临时文件)。









