std::filesystem::create_directory创建单层目录,create_directories创建多级目录;C++17起原生支持,需启用标准并链接stdc++fs(GCC下),常见失败原因包括父目录不存在、路径已存在但非目录、权限不足、非法字符或相对路径误用。

直接结论:用 std::filesystem::create_directory 创建单层目录,用 std::filesystem::create_directories 创建多级嵌套目录;C++17 起原生支持,无需第三方库,但需启用 C++17 标准并链接 stdc++fs(GCC 下常见)。
为什么 create_directory 会失败?常见错误现象
调用后返回 false 或抛出 std::filesystem::filesystem_error,典型原因包括:
- 父目录不存在 ——
create_directory不递归创建上级路径,只建最末一级 - 路径已存在且不是目录(比如是同名文件)
- 权限不足(如写入系统路径、只读挂载点)
- 路径含非法字符或过长(尤其 Windows 下 MAX_PATH 限制)
- 使用了相对路径但当前工作目录变动,导致实际目标偏移
create_directory 和 create_directories 怎么选?
关键区别在「是否递归」:
-
create_directory("a/b/c"):仅当a/b已存在时才创建c;否则失败 -
create_directories("a/b/c"):自动逐级创建a→a/b→a/b/c,只要权限允许就成功 - 两者都**不会覆盖**已存在的同名目录;若路径存在且是目录,均返回
true(不报错) - 若需“确保目录存在”,优先用
create_directories,更鲁棒
编译和链接注意事项(GCC / Clang 常见坑)
C++17 标准库头文件 在 GCC 8+ / Clang 9+ 支持,但容易漏掉链接步骤:
项目名称: B2C网络商城(ShoppingCity)开发平台: VS2005+SQLserver2000+C#开发周期: 1/月项目描述: 此项目是一个完整的B2C电子商务网站,实现了在网上直接浏览商品、购买商品、创建订单、评论商品、留言、用户管理等一系列的网上购物服务。功能设计注册和登录模块:1、注册用户信息;2、提交用户信息;3、用户登录;4、用户注销;用户和角色管理模块:1、角色管理;2、
立即学习“C++免费学习笔记(深入)”;
- 编译选项必须加
-std=c++17(或更高) - GCC 下必须显式链接
stdc++fs:g++ -std=c++17 main.cpp -lstdc++fs - Clang 有时需额外加
-lc++fs(取决于 libc++ 版本) - Windows MSVC 一般无链接问题,但需确保项目设置为 C++17
- 检查是否真的启用了:编译时加
-D_FILESYSTEM_VER=17并确认__cpp_lib_filesystem >= 201703L
一个安全创建目录的实操示例
兼顾存在性判断、错误捕获和跨平台习惯:
#include#include namespace fs = std::filesystem; int main() { fs::path target = "data/logs/2024/06"; try { if (fs::create_directories(target)) { std::cout << "目录创建成功: " << target << "\n"; } else { std::cout << "目录已存在: " << target << "\n"; } } catch (const fs::filesystem_error& e) { std::cerr << "目录操作失败: " << e.what() << "\n"; return 1; } }
注意:不要依赖 exists() 再调用 create_directories() —— 存在竞态(检查后被删),直接调用更可靠。真正复杂的是权限策略和符号链接处理,这些默认行为往往被忽略。









