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

星墨酱_2782

星墨酱_2782

2026-04-24

1016人浏览

原创

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 的 / 重载:

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。

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载

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

auto p = std::filesystem::path{"my/nested/dir"};
std::filesystem::create_directories(p);
#ifdef __linux__
    chmod(p.c_str(), 0755);  // 需要 <sys>
#endif</sys>
  • 不要在 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 做预检。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2024.03.14

2148

9

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

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

2024.03.14

959

6

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

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

2024.03.14

387

5

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

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

2024.03.14

307

5

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

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

2024.03.14

366

5

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

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

2024.03.14

560

5

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

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

2024.03.21

1389

9

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

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

2024.03.22

1177

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习