在C++项目开发中,经常会遇到需要创建多层文件夹的场景,比如保存日志、存储用户数据等。不同操作系统的文件系统API存在差异,Windows使用CreateDirectory系列接口,Linux和macOS使用mkdir系列接口,手动适配不同系统会增加开发成本。C++17标准引入的std::filesystem库提供了统一的文件系统操作接口,支持跨平台的文件夹创建、删除、遍历等操作,其中递归创建文件夹的功能可以直接通过标准接口实现,不需要额外编写系统适配代码。

std::filesystem核心接口说明
要实现递归创建文件夹,需要用到std::filesystem中的两个核心接口,分别是std::filesystem::exists和std::filesystem::create_directories。
std::filesystem::exists
该接口用于判断指定路径是否存在,函数原型如下:
#include <filesystem> namespace fs = std::filesystem; // 判断路径是否存在,存在返回true,不存在返回false bool exists(const fs::path& p, std::error_code& ec) noexcept; bool exists(const fs::path& p);
第一个重载版本会抛出异常,第二个重载版本通过error_code参数返回错误信息,不会抛出异常,实际开发中可以根据需要选择。
std::filesystem::create_directories
该接口用于递归创建多层目录,会自动创建路径中所有不存在的父目录,函数原型如下:
#include <filesystem> namespace fs = std::filesystem; // 递归创建目录,成功返回true,目录已存在也返回true bool create_directories(const fs::path& p, std::error_code& ec) noexcept; bool create_directories(const fs::path& p);
如果路径对应的目录已经存在,该接口会直接返回true,不会执行任何创建操作,也不会报错。
跨平台递归创建文件夹的实现步骤
完整的递归创建文件夹逻辑可以分为以下几步:
- 首先判断目标路径是否已经存在,如果存在则直接返回成功
- 如果路径不存在,调用
create_directories接口尝试创建 - 处理创建过程中的错误,比如权限不足、路径非法等情况
完整代码示例
下面是一个封装好的跨平台递归创建文件夹的函数,支持传入error_code参数获取错误信息,也支持直接调用获取创建结果:
#include <iostream>
#include <filesystem>
#include <string>
namespace fs = std::filesystem;
/**
* 跨平台递归创建文件夹
* @param dir_path 要创建的文件夹路径
* @param ec 可选的错误码参数,用于获取错误信息
* @return 创建成功或者目录已存在返回true,失败返回false
*/
bool create_dir_recursive(const std::string& dir_path, std::error_code* ec = nullptr) {
fs::path target_path(dir_path);
// 先判断路径是否已经存在
if (fs::exists(target_path)) {
// 路径存在,判断是否是目录
if (fs::is_directory(target_path)) {
return true;
} else {
// 路径存在但不是目录,返回错误
if (ec != nullptr) {
*ec = std::make_error_code(std::errc::not_a_directory);
}
return false;
}
}
// 路径不存在,尝试递归创建
if (ec != nullptr) {
return fs::create_directories(target_path, *ec);
} else {
try {
return fs::create_directories(target_path);
} catch (const fs::filesystem_error& e) {
std::cerr << "创建目录失败: " << e.what() << std::endl;
return false;
}
}
}
int main() {
// 测试创建多层目录
std::string test_dir = "./test/a/b/c";
std::error_code ec;
if (create_dir_recursive(test_dir, &ec)) {
std::cout << "目录创建成功或已存在" << std::endl;
} else {
std::cout << "目录创建失败,错误信息: " << ec.message() << std::endl;
}
// 测试路径存在但不是目录的情况
std::string file_path = "./test/a/b/c/test.txt";
// 先创建一个文件
FILE* fp = fopen(file_path.c_str(), "w");
if (fp != nullptr) {
fclose(fp);
}
if (!create_dir_recursive(file_path, &ec)) {
std::cout << "预期失败,错误信息: " << ec.message() << std::endl;
}
return 0;
}
注意事项
使用std::filesystem实现跨平台文件夹创建时,需要注意以下几点:
- 编译时需要开启C++17及以上标准,比如GCC编译时添加
-std=c++17参数,MSVC需要设置C++语言标准为C++17 - Windows系统下如果路径包含中文,需要确保源码文件的编码和编译器的编码设置一致,避免出现乱码问题
create_directories接口不会创建文件的父目录之外的路径,比如要创建./a/b/c.txt文件,需要先创建./a/b目录,该接口只负责目录创建,不会处理文件路径的场景- 不同系统对路径分隔符的处理是一致的,std::filesystem会自动适配Windows的反斜杠和Linux的正斜杠,不需要手动替换分隔符
std::filesystem是C++17引入的标准库,目前主流的编译器都已经完整支持,不需要额外安装第三方依赖,非常适合用来实现跨平台的文件系统操作逻辑。
C++std_filesystem递归创建文件夹跨平台修改时间:2026-07-02 03:33:32