C++如何跨平台地递归创建文件夹

来源:个人站长网作者:樱由罗头衔:网络博主
导读:本期聚焦于小伙伴创作的《C++如何跨平台地递归创建文件夹》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++如何跨平台地递归创建文件夹》有用,将其分享出去将是对创作者最好的鼓励。

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

C++如何跨平台地递归创建文件夹

std::filesystem核心接口说明

要实现递归创建文件夹,需要用到std::filesystem中的两个核心接口,分别是std::filesystem::existsstd::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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。