应使用 std::filesystem::create_directories 而非 create_directory,因其跨平台、原子性支持多级目录创建;后者仅建最后一级且上级缺失即失败;路径宜用正斜杠或 fs::path 拼接,输入需 weakly_canonical 归一化;异常须通过 e.code().value() 判断错误码,而非 e.what();返回 true 不保证可写,需额外验证。

直接用 std::filesystem::create_directories,别手写递归,也别误用 create_directory(少个 s)。 它是 C++17 标准唯一跨平台、可靠、原子的多级目录创建方案,Windows/Linux/macOS 行为一致,内部自动处理路径分隔符、相对路径规整和逐级检查。
为什么不能用 create_directory
它只建最后一级目录,上级任意缺失就失败。常见错误现象是:传入 "logs/2024/10",但 "logs" 不存在,函数直接抛 std::filesystem::filesystem_error,错误信息可能是 "No such file or directory" 或 "The system cannot find the path specified"。
- 返回值为
false(不是异常)时,也可能只是目标已存在且是文件——create_directory不允许覆盖文件 -
create_directories则不同:只要最终路径能成为目录(无论中间是否已存在),就返回true - 两者参数类型相同,极易拼错;编译器不会报错,运行时才暴露问题
路径字符串怎么写才安全
避免硬拼字符串,尤其别用 "a" + "/" + "b" —— 在 Windows 下某些旧工具链可能把 "C:\tmp" + "/data" 解析成 C: mp/data,触发未定义行为。
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 统一用正斜杠
/:如"config/cache/2026/10",std::filesystem内部自动适配平台分隔符 - 拼接用
std::filesystem::path的/重载:fs::path p = "a"; p /= "b"; p /= "c"; - 用户输入路径务必先
fs::weakly_canonical(p)归一化,消除./、../、重复//等歧义 - 中文路径需确保源码保存为 UTF-8,MSVC 编译加
/utf-8,否则可能在 Windows 上抛异常
错误处理不能只靠 e.what()
异常消息内容依赖系统 locale,中文 Windows 和英文 Linux 下 e.what() 返回文本完全不同,无法用于逻辑判断。
- 必须捕获
const fs::filesystem_error& e,再查e.code().value() - 常见值:
5是EACCES(拒绝访问),2是ENOENT(路径不存在),17是EEXIST(已存在) - 注意:
create_directories对已存在目录也返回true,所以异常通常意味着“不可修复的失败”,比如磁盘满、权限不足、长路径未启用等 - Windows 长路径(>260 字符)需系统开启
LongPathsEnabled,且程序 manifest 声明enableLongPath,否则即使路径合法也会失败
最易被忽略的是:返回 true 只代表目录结构创建成功,不代表你有写入权限。例如在 C:\Program Files 下调用 create_directories 可能静默成功(因为目录已存在),但后续写文件仍会因权限失败。生产代码应始终用 fs::is_writable(p) 或尝试创建一个临时文件来验证可写性。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










