std::filesystem::create_directory只创建最后一级目录,若父目录不存在则失败;应改用create_directories实现递归创建。

直接用 std::filesystem::create_directory,但必须确保路径父目录存在,否则失败。
为什么 create_directory 经常返回 false?
这个函数只创建**最后一级目录**,不递归建父目录。比如想建 "a/b/c",而 "a" 或 "a/b" 不存在,调用就会失败并抛出 std::filesystem::filesystem_error(或返回 false,取决于是否捕获异常)。
- 默认行为是“不自动创建上级”,和 Python 的
os.mkdir类似,不是os.makedirs - 常见错误现象:
create_directory("logs/2024/06")在"logs"不存在时静默失败(若忽略返回值)或抛异常 - 检查方式:调用前用
exists("logs")或is_directory("logs")预判
想一次性建完整路径,该用哪个函数?
用 std::filesystem::create_directories —— 注意是 directories 复数形式。它会逐级创建所有缺失的父目录。
- 成功时返回
true;即使目标目录已存在,也返回true(幂等) - 路径中任意一级权限不足、磁盘满、路径含非法字符(如 Windows 的
"CON"),都会抛filesystem_error - 示例:
try { std::filesystem::create_directories("data/cache/tmp"); } catch (const std::filesystem::filesystem_error& e) { // e.what() 包含具体错误,如 "No such file or directory" }
Windows 下要注意路径分隔符和权限
Windows 对反斜杠 \ 和长路径、保留名更敏感,std::filesystem 虽内部处理 Unicode,但仍受限于系统 API。
立即学习“C++免费学习笔记(深入)”;
- 推荐统一用正斜杠
/或原始字符串字面量:R"(C:\myapp\logs)",避免转义问题 - 如果路径以
\\?\开头(启用 Windows 长路径),filesystem可能不识别,应去掉前缀再传入 - 管理员权限不是必需的,但写入系统目录(如
C:\Program Files)会因 UAC 拒绝,此时异常信息通常是Access is denied
真正容易被忽略的是:create_directories 不会覆盖已存在的同名文件。如果路径上某一级是个普通文件(比如你误建了个叫 "logs" 的空文件),它就卡在那里报 Not a directory —— 这时候得先 remove 再重试。










