C++ filesystem怎么获取文件修改时间

梦婷小哥_7136

梦婷小哥_7136

2026-10-24

778人浏览

原创

c++oding="utf-8" ?>

std::filesystem::last_write_time 返回的是 std::filesystem::file_time_type,不是 time_t;它基于独立高精度时钟,需用 clock_cast 转 system_clock 或降级为秒级时间戳再转 time_t。

c++ filesystem怎么获取文件修改时间

std::filesystem::last_write_time 返回的是 time_t 还是 file_time_type?

返回的是 std::filesystem::file_time_type,不是 time_t。直接强转或传给 std::ctime 会编译失败或结果错误。这是最常踩的坑——误以为它和 C 风格时间一样。

原因在于 C++20 的 std::filesystem 使用独立的时钟类型(通常基于系统高精度时钟),和 std::chrono::system_clock 不兼容,也不能直接用 std::time_t 表示。

Memory System Optimizer
Memory System Optimizer

OpenCLAW 记忆系统优化:四层架构 + 自我反思 + 情绪识别 + 任务规划 + 12项增强功能

下载
  • 必须通过 std::filesystem::file_time_type::clock 转换到 std::chrono::system_clock(需调用 std::chrono::clock_cast)
  • 或者降级为秒级时间戳再转 time_t(更常用、兼容性更好)
  • C++20 起支持 clock_cast,但部分旧标准库(如 libstdc++

怎么把 last_write_time 转成可读的字符串(如 "2024-05-22 14:30:15")?

推荐用秒级截断 + std::strftime,稳定且跨平台。不要试图用 std::format 直接格式化 file_time_type(C++20 std::format 对文件时间的支持仍不完善)。

#include <filesystem>
#include <chrono>
#include <ctime>
#include <iostream>

namespace fs = std::filesystem;

fs::path p = "test.txt";
if (fs::exists(p)) {
    auto ftime = fs::last_write_time(p);
    // 截断到秒,转为 time_t
    auto s = std::chrono::time_point_cast<:chrono::seconds>(ftime).time_since_epoch().count();
    auto ctime = static_cast<:time_t>(s);

    char buf[64];
    std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", std::localtime(&ctime));
    std::cout 
<ul>
<li>用 <code>time_point_cast<seconds></seconds></code> 是为了丢弃纳秒/百纳秒部分,避免 <code>localtime</code> 处理溢出</li>
<li>
<code>std::localtime</code> 是线程不安全的,生产环境应改用 <code>std::localtime_r</code>(POSIX)或 <code>std::chrono::zoned_time</code>(C++20)</li>
<li>Windows 上注意 <code>std::filesystem</code> 需要 /std:c++20 和启用 Unicode(否则路径含中文可能失败)</li>
</ul>
<h3>为什么在 Windows 上获取的时间比资源管理器显示的慢 1 秒?</h3>
<p>不是代码问题,是 Windows 文件系统(NTFS)本身的精度限制:<code>last_write_time</code> 存储粒度为 100 纳秒,但某些 API 或驱动层会向下取整到最近的秒——尤其当文件由旧工具(如批处理 <code>copy</code>)修改时。</p>
<ul>
<li>用 PowerShell <code>(Get-Item "x.txt").LastWriteTime</code> 对比验证,如果也差 1 秒,就是系统行为,不是 <code>std::filesystem</code> bug</li>
<li>若需更高精度(如判断是否“刚刚”修改),建议用 <code>file_time_type::time_since_epoch()</code> 做纳秒级差值比较,而非转成字符串</li>
<li>Linux(ext4/xfs)通常能保持微秒级精度,但也要注意挂载选项(如 <code>noatime</code> 不影响 <code>last_write_time</code>)</li>
</ul>
<h3>跨平台编译时 missing last_write_time 怎么办?</h3>
<p>常见于没开 C++20 或没链接对应库。GCC 11+、Clang 12+、MSVC 2019 16.10+ 才完整支持 <code>std::filesystem</code>;且 GCC 需要链接 <code>-lstdc++fs</code>(Clang/MSVC 自动处理)。</p>
<ul>
<li>编译命令加 <code>-std=c++20</code>(不能只写 <code>c++17</code>)</li>
<li>GCC 用户务必加 <code>-lstdc++fs</code>,否则链接时报错:undefined reference to <code>std::filesystem::last_write_time</code>
</li>
<li>检查头文件是否用了 <code>#include <filesystem></filesystem></code>(不是 <code><experimental></experimental></code>,后者已废弃)</li>
<li>CMake 中推荐用 <code>target_link_libraries(myapp PRIVATE stdc++fs)</code> 并设置 <code>set(CMAKE_CXX_STANDARD 20)</code>
</li>
</ul>

Windows 下时区、精度、链接选项这三块最容易漏,尤其从旧项目迁移时。别信“只要包含头文件就能用”的直觉。</:time_t></:chrono::seconds></iostream></ctime></chrono></filesystem>

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

相关文章

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

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

下载

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

相关专题

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

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

2024.03.14

2248

9

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

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

2024.03.14

1019

6

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

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

2024.03.14

447

5

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

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

2024.03.14

327

5

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

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

2024.03.14

426

5

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

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

2024.03.14

600

5

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

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

2024.03.21

1409

9

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

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

2024.03.22

1217

7

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

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

2024.03.25

1325

9

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ 手册教程
C++ 手册教程

共41课时 | 78.4万人学习

C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习