c++oding="utf-8" ?>
createdirectory仅创建单层目录,父路径必须已存在;若失败需检查getlasterror,如error_path_not_found则需递归创建上级目录。

Windows下用 CreateDirectory 创建单层目录
在 Windows 平台,CreateDirectory 是最直接的 API,但它**只创建最后一级目录**,父路径必须已存在。比如想建 C:c,而 C: 不存在,调用会失败并返回 0。
常见错误是忽略返回值或没检查 GetLastError(),结果目录没建成功却以为成功了。正确做法是:
- 调用前确保路径使用反斜杠
(或双反斜杠\) - 检查返回值:非零表示成功,0 表示失败
- 失败时调用
GetLastError(),若为ERROR_PATH_NOT_FOUND,说明上级目录缺失,需递归创建
示例片段:
if (!CreateDirectory(L"C:\myapp\data", nullptr)) {
DWORD err = GetLastError();
if (err == ERROR_PATH_NOT_FOUND) {
// 需先创建 C:\myapp
}
}
跨平台用 std::filesystem::create_directories(C++17)
这是目前最推荐的方式,自动处理多级路径、权限、符号链接等细节,且行为在 Windows/macOS/Linux 上一致。注意它要求编译器支持 C++17,并链接 stdc++fs(GCC)或启用 /std:c++17(MSVC)。
容易踩的坑:
- 路径字符串类型:传
std::string或std::wstring均可,但 Windows 下宽字符更稳妥(避免 UTF-8 路径乱码) - 返回值是
bool:true 表示“至少创建了一个新目录”,false 表示所有目录已存在——不是错误信号 - 不抛异常,除非底层系统调用出严重问题(如磁盘满),此时会抛
std::filesystem::filesystem_error
简单用法:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
try {
std::filesystem::create_directories(L"C:\a\b\c");
} catch (const std::filesystem::filesystem_error& e) {
// 处理权限不足、路径非法等
}
Linux/macOS 下用 mkdir 需手动递归
POSIX 系统的 mkdir 默认只建单层,要建多级得加 -p 参数——但这只是 shell 行为,C++ 里调用 mkdir() 系统函数仍需自己拆解路径。
典型做法是把路径按 / 分割,逐级调用 mkdir(path_part, 0755),跳过已存在的部分。但要注意:
-
mkdir第二个参数是权限掩码,不是 umask;实际权限受进程 umask 影响 - 必须确保每级路径都是绝对路径或相对于当前工作目录有效,否则易出错
- 没有现成的“判断是否为目录”的原子操作,得用
stat()检查st_mode & S_IFDIR
所以除非有特殊限制(如不能用 C++17),否则不建议手写这套逻辑。
为什么不用 system("mkdir -p ...")
看似简单,实则隐患多:路径含空格或特殊字符时极易被 shell 解析错误;不同系统 mkdir 选项不一致(如 BusyBox 的 mkdir 可能不支持 -p);无法可靠捕获失败原因;还可能触发安全审计告警(执行外部命令)。
更关键的是:它绕过了 C++ 运行时对路径编码、错误码、线程安全的封装,调试时连错误来源都难定位。哪怕只是临时脚本,也应优先选 std::filesystem::create_directories。
真正麻烦的点往往不在“怎么建”,而在“建在哪”和“谁有权访问”——比如用户目录路径要用 SHGetKnownFolderPath(Windows)或 getpwuid(POSIX)获取,而不是硬写 C:Users... 或 /home/xxx。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










