std::filesystem::create_directories是C++17跨平台递归建目录的可靠方案,自动处理路径分隔符、权限及错误;返回true表示成功(含全已存在),false仅因路径非法、无权限等真正失败。

std::filesystem::create_directories 是 C++17 引入的可靠方式,能递归创建完整路径(包括中间不存在的父目录),只要权限允许、路径合法,就基本能成功。
为什么不用 mkdir 或系统命令
直接调用 mkdir 系统命令或 C 风格的 mkdir() 函数,只能创建单层目录,遇到 "logs/2024/06" 这种多级路径会失败;还要手动处理平台差异(Windows 用 \\,Linux/macOS 用 /)、错误码判断、权限掩码(mode_t 在 Windows 上无效)等问题。而 std::filesystem::create_directories 内置跨平台路径解析和递归逻辑,省去大量胶水代码。
create_directories 的典型用法与返回值含义
该函数返回 bool:成功创建至少一个新目录时为 true;若所有目录已存在,也返回 true(不报错,这是设计行为);仅当路径非法、无权限、磁盘满或父路径是文件而非目录时才返回 false。
使用前需包含头文件并启用 C++17:
立即学习“C++免费学习笔记(深入)”;
#includenamespace fs = std::filesystem;
示例:
if (!fs::create_directories("data/cache/images")) {
// 失败:可能是 "data" 是个普通文件,或没有写权限
std::cerr << "Failed to create directories: " << "data/cache/images" << '\n';
}
- 路径可使用正斜杠
/,std::filesystem自动转义适配 Windows - 相对路径基于当前工作目录(
getcwd),建议用绝对路径或先调用fs::current_path()明确上下文 - 不要对已有文件调用该函数——如果
"logs"已是个文件,create_directories("logs/err")必然失败
常见失败原因与调试建议
返回 false 时不能只靠布尔值判断,需结合异常或状态检查:
- 开启异常支持:编译时加
-fexceptions(默认通常开启),并在调用前设置fs::current_path()确认起点 - 捕获异常更准:用
fs::create_directories(path, ec)形式,其中ec是std::error_code&,可输出具体错误,如ec.message()返回"Permission denied"或"Not a directory" - 注意路径末尾斜杠:传入
"output/"和"output"行为一致,但若"output"已是文件,则两者都失败 - 符号链接:如果路径中某段是悬空符号链接,
create_directories会失败(不会自动解引用)
真正容易被忽略的是「父路径类型校验」——函数不检查中间节点是否为目录,只在尝试创建子目录时报错。所以最好在调用前用 fs::status(path).type() == fs::file_type::directory 做轻量预检,尤其在关键路径上。










