0

0

C++17文件系统库怎么用 跨平台路径操作新特性

P粉602998670

P粉602998670

发布时间:2025-08-18 14:24:02

|

627人浏览过

|

来源于php中文网

原创

C++17文件系统库通过std::filesystem::path类抽象路径表示,自动适配不同操作系统路径分隔符,并提供exists、is_directory、create_directory等函数实现跨平台文件操作,结合try-catch或error_code处理异常,避免程序崩溃,同时可借助chrono库将file_time_type转换为可读的日期时间格式。

c++17文件系统库怎么用 跨平台路径操作新特性

C++17文件系统库主要用于跨平台的文件和目录操作,它提供了一套标准接口,解决了不同操作系统路径表示方式的差异,让代码更具可移植性。

跨平台路径操作的核心在于使用

std::filesystem::path
类来表示路径,以及利用库提供的函数进行各种文件系统操作。

解决方案

  1. 包含头文件: 首先,需要在代码中包含

    头文件。

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

    #include 
    #include 
    namespace fs = std::filesystem; // 建议使用命名空间别名
  2. 创建路径对象: 使用

    std::filesystem::path
    类创建路径对象。 可以从字符串字面量、
    std::string
    等构造路径。

    fs::path p1 = "/home/user/documents"; // 绝对路径
    fs::path p2 = "data/input.txt";       // 相对路径
    fs::path p3 = p1 / p2;                // 路径拼接
  3. 路径操作:

    std::filesystem::path
    提供了丰富的成员函数,用于路径的各种操作。

    • p.filename()
      : 获取文件名(不包含目录)。
    • p.parent_path()
      : 获取父目录路径。
    • p.extension()
      : 获取文件扩展名。
    • p.is_absolute()
      : 检查是否为绝对路径。
    • p.lexically_normal()
      : 规范化路径,例如移除多余的
      .
      ..
    fs::path p = "/home/user/documents/report.pdf";
    std::cout << "Filename: " << p.filename() << std::endl; // 输出: report.pdf
    std::cout << "Parent path: " << p.parent_path() << std::endl; // 输出: /home/user/documents
    std::cout << "Extension: " << p.extension() << std::endl; // 输出: .pdf
  4. 文件系统操作: C++17文件系统库提供了许多函数用于执行实际的文件系统操作。

    • fs::exists(p)
      : 检查路径是否存在。
    • fs::is_regular_file(p)
      : 检查是否为普通文件。
    • fs::is_directory(p)
      : 检查是否为目录。
    • fs::create_directory(p)
      : 创建目录。
    • fs::remove(p)
      : 删除文件或空目录。
    • fs::copy(from, to)
      : 复制文件。
    • fs::file_size(p)
      : 获取文件大小。
    • fs::last_write_time(p)
      : 获取最后修改时间。
    fs::path dir = "mydir";
    if (!fs::exists(dir)) {
        if (fs::create_directory(dir)) {
            std::cout << "Directory created successfully." << std::endl;
        } else {
            std::cerr << "Failed to create directory." << std::endl;
        }
    }
    
    fs::path file = dir / "myfile.txt";
    std::ofstream outfile(file);
    if (outfile.is_open()) {
        outfile << "Hello, world!" << std::endl;
        outfile.close();
    }
    
    if (fs::exists(file) && fs::is_regular_file(file)) {
        std::cout << "File size: " << fs::file_size(file) << std::endl;
    }
  5. 遍历目录: 使用

    fs::directory_iterator
    fs::recursive_directory_iterator
    可以遍历目录中的文件和子目录。

    fs::path dir_to_scan = "."; // 当前目录
    for (const auto& entry : fs::directory_iterator(dir_to_scan)) {
        std::cout << entry.path() << std::endl;
    }
    
    // 递归遍历
    for (const auto& entry : fs::recursive_directory_iterator(dir_to_scan)) {
        std::cout << entry.path() << std::endl;
    }

C++17文件系统库如何处理不同操作系统的路径差异?

Bandy AI
Bandy AI

全球领先的电商设计Agent

下载

C++17文件系统库通过

std::filesystem::path
类及其相关函数,对底层操作系统差异进行了抽象。 它会根据当前操作系统自动调整路径分隔符(例如,Windows使用
\
,而Linux/macOS使用
/
)。 用户只需使用标准库提供的接口,无需关心底层细节。 例如,无论在哪个平台上,都可以使用
/
来拼接路径,库会自动将其转换为正确的形式。

文件系统库的异常处理机制是什么?如何避免程序崩溃?

文件系统操作可能会抛出异常,例如文件不存在、权限不足等。 C++17文件系统库提供了两种处理异常的方式:

  • 抛出异常: 默认情况下,文件系统函数在遇到错误时会抛出

    std::filesystem::filesystem_error
    异常。 可以使用
    try-catch
    块来捕获并处理这些异常。

    try {
        fs::remove("nonexistent_file.txt");
    } catch (const fs::filesystem_error& e) {
        std::cerr << "Error removing file: " << e.what() << std::endl;
    }
  • 错误码: 可以传递一个

    std::error_code
    对象给文件系统函数,这样函数就不会抛出异常,而是将错误信息写入
    std::error_code
    对象中。 然后可以检查
    std::error_code
    对象的值来判断是否发生了错误。

    std::error_code ec;
    fs::remove("nonexistent_file.txt", ec);
    if (ec) {
        std::cerr << "Error removing file: " << ec.message() << std::endl;
    }

为了避免程序崩溃,建议始终使用

try-catch
块或
std::error_code
来处理文件系统操作可能产生的异常。 特别是在处理用户输入的文件路径时,一定要进行充分的错误检查。

如何使用文件系统库获取文件的最后修改时间,并将其转换为可读的日期时间格式?

使用

fs::last_write_time(p)
可以获取文件的最后修改时间。 该函数返回一个
std::filesystem::file_time_type
对象,表示文件的时间戳。 要将其转换为可读的日期时间格式,可以使用
库。

#include 
#include  // 用于格式化输出

fs::path file_path = "myfile.txt";
if (fs::exists(file_path)) {
    auto last_write_time = fs::last_write_time(file_path);

    // 将 file_time_type 转换为 system_clock::time_point
    auto system_time = std::chrono::clock_cast(last_write_time);

    // 将 time_point 转换为 time_t
    std::time_t tt = std::chrono::system_clock::to_time_t(system_time);

    // 使用 localtime 将 time_t 转换为 tm 结构体
    std::tm* ttm = std::localtime(&tt);
    if (ttm != nullptr) {
        // 格式化输出
        std::cout << "Last write time: " << std::put_time(ttm, "%Y-%m-%d %H:%M:%S") << std::endl;
    } else {
        std::cerr << "Error converting time." << std::endl;
    }
} else {
    std::cerr << "File not found." << std::endl;
}

这段代码首先获取文件的最后修改时间,然后将其转换为

std::chrono::system_clock::time_point
,再转换为
std::time_t
,最后使用
std::localtime
将其转换为
std::tm
结构体,以便使用
std::put_time
进行格式化输出。 记住检查
localtime
的返回值,以确保时间转换成功。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1501

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

633

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

589

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

172

2025.07.29

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

16

2026.01.29

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 5万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

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

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