
mkdir() 在 Windows 和 Linux 下都不支持多级路径
直接调用 mkdir() 或 _mkdir() 创建 "a/b/c" 这种路径会失败,返回 -1(Linux)或 0(Windows),errno 通常是 ENOENT —— 因为父目录不存在。它只创建**最后一级**,不自动补全上级。
所以必须手动拆解路径、逐级判断并创建。核心思路是:按路径分隔符切分,从根开始,每级检查是否存在,不存在就调用系统 API 创建。
常见错误是直接传入完整路径给 mkdir(),或者忽略路径分隔符差异(/ vs )导致 Windows 下解析失败。
用 std::filesystem::create_directories() 最省事(C++17 起)
如果你的编译器支持 C++17(GCC 8+、Clang 7+、MSVC 2017+),这是首选方案:std::filesystem::create_directories() 原生支持递归创建,自动处理分隔符、权限、跨平台细节。
立即学习“C++免费学习笔记(深入)”;
示例:
#include <filesystem>
namespace fs = std::filesystem;
fs::create_directories("a/b/c/d"); // 自动创建 a → a/b → a/b/c → a/b/c/d
注意点:
- 需要链接
-lstdc++fs(GCC 旧版本)或启用/std:c++17+/D _HAS_CXX17=1(MSVC) - 返回
bool:成功为true;若已存在所有目录也返回true(不是错误) - 抛出
fs::filesystem_error异常(如权限不足、磁盘满),需捕获
手写递归创建时,路径分割和遍历顺序很关键
手动实现要避免“从后往前”或“一次性 split 后全量创建”——容易因路径格式(如 "./a/../b/c"、"C:xy")出错。推荐做法是:
- 用
std::filesystem::path解析并正规化路径(C++17),或用boost::filesystem::path(C++11/14) - 否则,自己按分隔符切分前,先去掉末尾斜杠、处理相对路径前缀(
"./","../") - 逐级构造子路径:对
"a/b/c",依次尝试"a"→"a/b"→"a/b/c",每级调用access()(POSIX)或GetFileAttributes()(Windows)判断是否存在
Windows 下别用 _mkdir() 处理含反斜杠的宽字符路径,优先用 CreateDirectoryW() 并确保传入的是正规化后的 UTF-16 路径。
兼容旧标准(C++11/14)且不用 Boost?得自己处理平台差异
最小可行实现需封装两套逻辑:
- Linux/macOS:用
mkdir()+access(),分隔符为'/' - Windows:用
CreateDirectoryA()或CreateDirectoryW()+GetFileAttributes(),接受'/'或'\',但建议统一转成'\'再处理
关键细节:
– 不要用 system("mkdir -p ..."):不可移植、无错误反馈、有注入风险
– 权限掩码在 Linux 下要传 0755,Windows 忽略该参数
– 当前工作目录变化不影响路径解析,但相对路径(如 "../logs")必须基于当前目录计算绝对路径再处理,否则逐级创建会错位
最易被忽略的是路径中出现空格或 Unicode 字符:C 风格函数在 Windows 下默认 ANSI 编码,中文路径大概率失败,必须上宽字符接口。


















