讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何跨平台递归创建多级文件夹 _ std::filesystem接口【干货】

星墨酱_2782

星墨酱_2782

发布时间:2026-04-24 14:43:13

|

1016人浏览过

|

来源于php中文网

原创

std::filesystem::create_directories比mkdir -p更可靠,因其是C++17标准定义的跨平台原子操作,自动逐级创建缺失父目录,且统一处理路径分隔符、Unicode、符号链接及错误异常,避免手写递归的边界问题。

c++如何跨平台递归创建多级文件夹 _ std::filesystem接口【干货】

std::filesystem::create_directories 为什么比 mkdir -p 更可靠

因为 std::filesystem::create_directories 是 C++17 标准定义的原子操作,它会逐级检查并创建缺失的父目录,且在 Windows、Linux、macOS 上行为一致。而手写递归调用 mkdir 或 CreateDirectory 容易漏掉权限、路径分隔符、已存在目录等边界情况。

常见错误现象:std::filesystem::create_directory(注意不是 create_directories)只建最后一级,父目录不存在时直接返回 false;或者用 std::filesystem::status 检查路径前没处理 std::filesystem::file_status 的 no_status 状态,导致误判路径不可写。

  • 必须用 create_directories,不是 create_directory
  • 路径字符串建议统一用正斜杠 /,std::filesystem 内部会自动适配平台分隔符(Windows 下也认 /)
  • 若路径含中文或 Unicode 字符,在 Windows 上需确保编译器启用 UTF-8 源码支持(如 MSVC 加 /utf-8),否则可能抛 std::filesystem::filesystem_error

跨平台路径拼接别用字符串 +,要用 std::filesystem::path /

手动拼接 "a" + "/" + "b" 在 Windows 下生成 a/b,但某些旧版 MinGW 或 Cygwin 可能不识别;更严重的是,当某段路径含 (比如用户输入)时,"C:\tmp" + "/data" 会变成 C: mp/data,触发未定义行为。

正确做法是用 std::filesystem::path 的 / 重载:

立即学习“C++免费学习笔记(深入)”;

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
std::filesystem::path p = "a";
p /= "b";           // 等价于 p = p / "b"
p /= "c.txt";       // 最终在 Windows 上是 ac.txt,Linux/macOS 是 a/b/c.txt
std::filesystem::create_directories(p.parent_path());
  • p.parent_path() 自动截掉最后一段(文件名或末尾斜杠),安全获取目录部分
  • 避免对路径字符串做 .c_str() 后传给系统 API —— std::filesystem 已封装好,没必要绕路
  • 如果路径来自用户输入,先用 std::filesystem::weakly_canonical 归一化(解决 ../、重复 / 等问题),再创建

权限控制:Linux/macOS 默认 0755,Windows 不生效

std::filesystem::create_directories 不接受权限参数,它依赖系统默认 umask(Linux/macOS)或安全描述符(Windows)。这意味着你在 Linux 上跑出的目录可能是 0700(被 umask 掩掉),而非预期的 0755;Windows 则完全忽略权限位,新建目录继承父目录 ACL。

若需显式设权限,只能创建后补调:

auto p = std::filesystem::path{"my/nested/dir"};
std::filesystem::create_directories(p);
#ifdef __linux__
    chmod(p.c_str(), 0755);  // 需要 <sys/stat.h>
#endif
  • 不要在 Windows 上调 chmod,会编译失败或静默忽略
  • 避免用 std::filesystem::permissions 改权限——它底层调的是 chmod 或 SetFileAttributes,但对目录递归无效,且 Windows 对权限粒度控制很弱
  • 真正需要细粒度权限时(如 Docker 容器内),应由部署流程统一设置,而非在运行时硬编码

错误处理不能只看 return bool,得捕获 filesystem_error

create_directories 返回 bool 表示“是否新建了至少一个目录”,但它成功也可能因权限不足、磁盘满、符号链接断裂等失败——此时会抛 std::filesystem::filesystem_error,而不是返回 false。

典型误用:

if (!std::filesystem::create_directories(p)) {
    // 这里以为只是“目录已存在”,但其实可能根本没进到这行——异常已抛出
}
  • 必须用 try/catch 捕获 std::filesystem::filesystem_error
  • 异常的 .code().value() 可对应系统 errno(Linux/macOS)或 Win32 错误码(Windows),比如 13 是 Permission denied,2 是 No such file or directory
  • 若想静默忽略“已存在”错误,可检查 e.code() == std::errc::file_exists,但注意:该错误仅在尝试创建已存在**文件**时抛出,目录已存在不会报错,create_directories 直接返回 false

最常被忽略的是符号链接路径——如果 p 中间某段是悬空 symlink,create_directories 在 Linux/macOS 上会失败并抛 std::errc::not_a_directory,Windows 则可能成功也可能失败,取决于 symlink 类型和权限。这种场景下,得先 std::filesystem::exists + std::filesystem::is_symlink 做预检。

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2168

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

979

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

387

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

366

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

580

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1389

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1177

2024.03.22

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

120

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn