std::filesystem::create_directories是c++17起跨平台创建多级目录的唯一推荐方案,自动处理中间路径、幂等、需链接-lstdc++fs,注意路径格式、权限及错误码细分处理。

std::filesystem::create_directories 是唯一靠谱的选择
别折腾自己写递归了,C++17 起 std::filesystem::create_directories 就是干这个的——它会自动创建路径中所有不存在的中间目录,且幂等(重复调用不报错)。Windows、Linux、macOS 全平台可用,只要编译器支持 C++17(GCC 8+、Clang 7+、MSVC 2017 Update 5+)。
常见错误现象:std::filesystem::create_directory 报 std::filesystem::filesystem_error: No such file or directory,因为它只建最后一级,父目录缺一个就崩。
- 必须链接
-lstdc++fs(GCC/Clang),MSVC 默认启用 - 路径末尾不能带斜杠(
"foo/bar/"可能失败;用"foo/bar"或"foo/bar/."更稳妥) - 路径需为绝对路径或相对于当前工作目录的相对路径;若依赖相对路径,注意程序运行时 cwd 可能和预期不同
路径字符串里的反斜杠和转义问题
Windows 下写 "C: empmyappcache" 会炸—— 和 m 被当转义符。这不是函数的问题,是字符串字面量没写对。
- 用正斜杠:
"C:/temp/myapp/cache"(Windows 原生支持,最省心) - 用原始字符串:
R"(C: empmyappcache)" - 双反斜杠:
"C:\temp\myapp\cache"(易漏写,不推荐) - 避免拼接
std::string时混用'\'和'/',统一用std::filesystem::path构造更安全
权限与跨文件系统边界失败怎么办
create_directories 默认用当前进程 umask 创建目录(Unix)或继承父目录权限(Windows)。但它不会帮你绕过权限限制,也不会跨挂载点自动处理。
典型失败场景:Permission denied(目标父目录不可写)、Read-only file system、或路径含符号链接且最后组件指向只读挂载点。
- 先检查父路径可写性:
std::filesystem::is_writable(parent_path) - 避免在 NFS 或某些容器卷上强制创建深层结构,延迟或静默失败很常见
- 不要假设
create_directories返回true就代表所有子目录都“立即”可访问(POSIX 系统有缓存,但一般不用管)
错误处理不能只靠 try-catch
捕获 std::filesystem::filesystem_error 是必须的,但很多情况你得进一步判断错误类型,而不是一概打印退出。
比如:目标已是文件而非目录、磁盘满、路径过长、循环符号链接……这些错误码藏在 e.code().value() 里。
- 检查是否已存在且非目录:
e.code() == std::errc::file_exists仅表示路径存在,不保证是目录;要再调is_directory(e.path1()) - 路径太长?
e.code() == std::errc::filename_too_long(Windows 常见) - 想静默忽略“已存在”,直接检查
exists(path)再决定是否调用,比 catch 更轻量
实际项目里,多级目录创建往往只是初始化一环,失败后该清理、该提示、该 fallback,得看上下文——函数本身只负责“尽力而为”,不替你做决策。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











