首页 > 后端开发 > C++ > 正文

c++的std::filesystem库怎么用 跨平台的文件和目录操作【详解】

穿越時空
发布: 2025-12-20 10:23:03
原创
710人浏览过
std::filesystem 是 C++17 引入的跨平台文件系统库,核心为 path 类,支持路径操作、属性查询、目录遍历及文件管理,统一替代系统 API。

c++的std::filesystem库怎么用 跨平台的文件和目录操作【详解】

std::filesystem 是 C++17 引入的标准库组件,用于跨平台地处理文件路径、查询文件属性、遍历目录、创建/删除/重命名文件和目录等。它替代了过去依赖系统 API(如 Windows 的 Win32 或 POSIX 的 stat/opendir)的繁琐写法,统一用一套接口适配 Linux、macOS、Windows 等主流系统。

基础类型:path 是核心

std::filesystem::path 是整个库的基石,不是字符串,而是一个智能路径封装类,能自动处理不同系统的路径分隔符(/ vs \)、规范化路径(如 ./a/../bb)、拼接、分解等。

  • 构造方式灵活:fs::path p = "data/log.txt";fs::path p("config");fs::path p = fs::current_path() / "cache" / "temp.bin";
  • 常用成员:p.filename()p.parent_path()p.extension()p.has_extension()p.is_absolute()
  • 转字符串时注意:p.string() 返回本地编码(如 Windows 上是 UTF-8 或窄字符,取决于编译设置),推荐用 p.generic_string() 获取标准化斜杠的字符串(适合日志或调试)

判断与查询:exists、status、file_size 等

fs::exists(p) 判断路径是否存在;用 fs::status(p) 获取详细类型和权限信息;再结合 fs::is_regular_file()fs::is_directory()fs::is_symlink() 精确识别。

  • 检查是否为普通文件并获取大小:if (fs::is_regular_file(p)) size_t s = fs::file_size(p);
  • 获取最后修改时间:auto t = fs::last_write_time(p); 返回 fs::file_time_type,可转为 std::chrono::time_point 处理
  • 注意:某些操作(如读取时间或大小)在文件被其他进程独占打开时可能抛出 fs::filesystem_error,建议用 try-catch 包裹

目录遍历:recursive_directory_iterator 最常用

遍历一个目录下的所有项(含子目录)推荐用 fs::recursive_directory_iterator;只遍历当前层用 fs::directory_iterator

西语写作助手
西语写作助手

西语助手旗下的AI智能写作平台,支持西语语法纠错润色、论文批改写作

西语写作助手 21
查看详情 西语写作助手

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

  • 简单递归遍历:for (const auto& entry : fs::recursive_directory_iterator("/home/user")) { std::cout
  • 跳过符号链接(避免循环):fs::recursive_directory_iterator(p, fs::directory_options::skip_permission_denied)
  • entry 是 fs::directory_entry 类型,调用 entry.path()entry.is_directory()entry.file_size() 等方法获取信息

增删改操作:create_directories、remove、rename

创建目录支持多级(类似 shell 的 mkdir -p),删除支持单个文件/空目录,或递归删除非空目录;重命名可跨分区(底层自动复制+删除)。

  • 创建完整路径:fs::create_directories("a/b/c/d"); —— 自动创建 a、a/b、a/b/c
  • 删除文件或空目录:fs::remove(p);;强制递归删除:fs::remove_all(p);
  • 移动/重命名:fs::rename("old.txt", "new.txt");;也可用于移动到另一目录:fs::rename("src/file.dat", "dst/file.dat");
  • 注意:这些操作都可能失败(权限不足、路径被占用、磁盘满等),务必检查返回值或捕获异常

编译与兼容性提醒

启用 std::filesystem 需要:C++17 或更高标准 + 链接对应系统库。

  • g++/Clang:加 -std=c++17(或 c++20),Linux/macOS 还需链接 -lstdc++fs(GCC 9+ 可能不再需要);Clang 通常需 -lc++fs
  • MSVC(Visual Studio 2017+):默认支持,无需额外链接,但确保项目设置为 C++17 或以上
  • 不支持 C++14 或更早版本;若需兼容旧标准,可用 boost::filesystem 作为替代

以上就是c++++的std::filesystem库怎么用 跨平台的文件和目录操作【详解】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

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

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号