windows下createdirectory仅创建单层目录,父路径必须存在,否则返回0并报error_path_not_found;跨平台推荐c++17的std::filesystem::create_directories,可自动递归创建多级目录。

Windows下用CreateDirectory创建单层文件夹
直接调用WinAPI最简单,但只支持单层路径(比如"logs"),不自动建父目录。如果路径含多级(如"data/cache/temp"),会失败并返回0。
常见错误现象:CreateDirectory返回0,但GetLastError()返回ERROR_PATH_NOT_FOUND——说明中间某一级目录不存在。
- 必须先确保父目录存在,或手动逐级创建
- 路径字符串要用反斜杠
"\"或正斜杠"/"(Win10+支持) - 第二个参数传
nullptr即可,权限由系统默认策略控制
if (!CreateDirectory(L"data\cache", nullptr)) {
DWORD err = GetLastError();
// 处理错误,比如检查err == ERROR_PATH_NOT_FOUND
}
跨平台用std::filesystem::create_directories(C++17)
这是目前最推荐的方式,自动递归创建所有缺失的父目录,Linux/macOS/Windows全支持,且语义清晰。
使用前提:编译器需启用C++17(-std=c++17),链接时可能需加-lstdc++fs(GCC老版本)或-lc++fs(Clang)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
create_directories返回bool:成功为true,已存在也算成功 -
create_directory(无s)只建最后一级,失败时不重试,适合明确知道父目录已存在时 - 路径用
std::string或std::wstring均可,UTF-8编码在多数系统下直接可用
#include <filesystem>
namespace fs = std::filesystem;
if (!fs::create_directories("data/cache/temp")) {
// 创建失败,可能是权限不足或磁盘满
}</filesystem>
旧项目没C++17?用boost::filesystem::create_directories
Boost是成熟替代方案,行为和std::filesystem几乎一致,适合无法升级标准的项目。
注意:Boost.Filesystem不是头文件-only库,需链接-lboost_filesystem -lboost_system,且不同Boost版本对Unicode支持略有差异。
- Windows下用
boost::filesystem::path构造宽字符路径更稳妥(如L"data\中文") - Linux下普通
std::string路径足够,但避免空格或特殊字符未转义 - Boost 1.70+已基本对齐C++17标准,可平滑迁移到
std::filesystem
权限和错误处理容易被忽略的点
创建失败不一定是因为路径错——更常因权限、挂载点不可写、NTFS ACL限制或杀毒软件拦截。
- 不要只检查返回值,务必用
std::filesystem::status或GetLastError确认具体原因 - Linux下
mkdir -p等效于create_directories,但C++里不能依赖shell命令,尤其嵌入式或沙箱环境 - 路径末尾带斜杠(如
"dir/")在某些旧实现中可能触发奇怪行为,统一用不带尾斜杠的规范路径
递归创建这件事本身不复杂,真正耗时间的是判断“为什么没建出来”——多数时候问题不在代码,而在运行时环境权限或路径合法性。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










