std::filesystem::create_directories是c++17标准推荐解法,可一次性递归创建完整路径;误用无s的create_directory会因上级缺失而失败;需检查返回值并验证目录可写性,而非仅依赖异常。

std::filesystem::create_directories 是正确选择
直接调用 std::filesystem::create_directories 就能递归创建多级目录,不需要自己写循环或判断中间路径是否存在。它会自动检查每一级,只创建缺失的部分,已存在的目录完全跳过,不会报错。
注意不是 std::filesystem::create_directory —— 后者只建单层,路径中任意上级不存在就直接抛 std::filesystem::filesystem_error。
示例:
#include <filesystem>
namespace fs = std::filesystem;
fs::create_directories("a/b/c/d"); // 成功:依次建 a → a/b → a/b/c → a/b/c/d
</filesystem>
路径参数必须是绝对路径还是相对路径?
两者都行,但行为依赖当前工作目录(CWD)。相对路径按进程当前工作目录解析,不是按源码位置。调试时容易误判“为什么路径没按预期创建”,建议显式使用绝对路径或先转成绝对路径。
安全做法:
- 用
fs::absolute("relative/path")转换后再传给create_directories - 或用
fs::current_path()确认当前 CWD,避免隐式依赖 - Windows 下注意路径分隔符:用正斜杠
/或双反斜杠\,单反斜杠在字符串字面量里是转义符,会出错
权限和错误处理不能省略
create_directories 默认使用系统默认权限(Linux/macOS 上通常是 0755,Windows 忽略权限位),没法直接指定 mode。如果需要自定义权限(比如禁止组/其他用户写入),得在创建后用 fs::permissions 单独设。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
错误处理推荐捕获 std::filesystem::filesystem_error,常见触发场景:
- 父路径是文件而非目录(例如已有
a/b是个普通文件,再建a/b/c就失败) - 磁盘满、权限不足、路径含非法字符(如 Windows 的
:|?*) - 符号链接终点不可达(
create_directories不解引符号链接,但路径中含坏链接会失败)
示例错误处理:
try {
fs::create_directories("log/debug/2024/06");
} catch (const fs::filesystem_error& e) {
// e.code() 可查具体错误,e.what() 包含路径和原因
std::cerr
<h3>跨平台兼容性要注意的细节</h3>
<p>C++17 标准引入 <code>std::filesystem</code>,但 MSVC 从 19.29(VS 2019 v16.11)、GCC 11、Clang 12 才开始稳定支持。老版本编译会失败,别只看标准不看工具链。</p>
<p>Windows 上还有两个易忽略点:</p>
- 长路径支持:默认受限于 MAX_PATH(260 字符),需启用 long path awareness(manifest 文件 + 注册表设置),否则路径超长直接失败
- 驱动器根目录写法:
"D:\foo\bar"可以,但"D:foo\bar"(缺\)会被解释为相对路径,可能建到 C: 下
真正麻烦的不是语法,而是路径语义在不同系统间的微妙差异——比如 "./a/../b" 在 Linux 和 Windows 解析一致,但遇到挂载点或符号链接时行为可能分叉。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










