0

0

c++中如何使用std::filesystem::last_write_time_c++获取修改时间【汇总】

尼克

尼克

发布时间:2026-01-19 01:43:29

|

534人浏览过

|

来源于php中文网

原创

c++kquote>std::filesystem::last_write_time是C++17引入的获取文件最后修改时间戳的函数,返回file_time_type类型值,需通过to_sys(C++20)或系统调用兜底转换为可读时间。

c++中如何使用std::filesystem::last_write_time_c++获取修改时间【汇总】

std::filesystem::last_write_time 是什么函数

std::filesystem::last_write_time 是 C++17 引入的标准库函数,用于获取文件或目录的最后修改时间戳(std::filesystem::file_time_type 类型)。它不是“last_write_time_c++”——后者并不存在,属于常见拼写/记忆错误。

该函数返回的是一个高精度、与系统时钟对齐的时间点,但**不是 std::chrono::system_clock::time_point**,不能直接传给 std::put_timestd::format(C++20);需先转换。

如何正确获取并转换为可读时间字符串

直接调用 last_write_time 返回的是 file_time_type,而标准输出需要 system_clock::time_point。C++20 起可通过 std::filesystem::file_time_type::clock::to_sys 转换;C++17 需借助平台适配或第三方辅助(如 Boost),或使用 std::chrono::file_clock(若编译器支持)。

  • Clang 14+/GCC 12+ 在启用 -std=c++20 时支持 file_time_type::clock::to_sys
  • MSVC 19.30+(VS 2022 17.0+)已实现该转换
  • 若编译器不支持,file_time_type 无法安全转为 system_clock,强行转换可能导致负偏移或崩溃
#include 
#include 
#include 
#include 

namespace fs = std::filesystem;

int main() {
    auto fpath = fs::path("example.txt");
    if (fs::exists(fpath)) {
        auto tp = fs::last_write_time(fpath);
        // C++20 推荐方式
        auto sys_tp = fs::file_time_type::clock::to_sys(tp);
        auto tmc = std::chrono::system_clock::to_time_t(sys_tp);
        std::cout << std::put_time(std::localtime(&tmc), "%Y-%m-%d %H:%M:%S") << '\n';
    }
}

常见错误:跨平台时间戳解析失败

Windows 和 Linux 对 file_time_type 的底层实现不同:Windows 使用 FILETIME(100ns 单位,基于 1601 年),Linux 通常用 stat.st_mtim(纳秒级,基于 1970 年)。C++ 标准要求 file_time_type 表示“文件系统原生时间”,但未强制统一 epoch —— 这意味着:

ClipDrop
ClipDrop

Stability.AI出品的图片处理系列工具(背景移除、图片放大、打光)

下载

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

  • tp.time_since_epoch().count() 在不同平台数值不可比
  • 不做 to_sys() 转换就直接用 duration_castseconds 可能得负值(尤其 Windows 上)
  • 某些旧版 libstdc++(GCC file_time_type 错误映射到 system_clock,导致 1970 年前时间显示异常

替代方案:用 stat 系统调用兜底(C++17 兼容)

如果目标环境不确定是否支持 to_sys,或需兼容 C++17 编译器,更稳妥的做法是绕过 std::filesystem,直接调用 POSIX stat 或 Windows GetFileTime

  • Linux/macOS:struct stat st; stat(path.c_str(), &st); st.st_mtim.tv_sec
  • Windows:FILETIME ft; GetFileTime(hFile, nullptr, nullptr, &ft);,再用 FileTimeToSystemTime
  • 跨平台封装推荐用 boost::filesystem::last_write_time(返回 time_t

真正麻烦的从来不是“怎么取时间”,而是“怎么让这个时间在所有机器上都代表同一个时刻”。别迷信 std::filesystem 的跨平台承诺,尤其是涉及时间转换时,to_sys 是否可用、是否被正确实现,必须实测验证。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.20

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

431

2024.06.27

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

431

2024.06.27

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

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

258

2023.08.03

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

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

208

2023.09.04

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

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

1465

2023.10.24

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

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

精品课程

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

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

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

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