0

0

c++怎么获取文件最后修改时间_c++文件属性查询【技巧】

穿越時空

穿越時空

发布时间:2026-02-11 13:26:02

|

756人浏览过

|

来源于php中文网

原创

最直接方案是用C++17的std::filesystem::last_write_time,需启用C++17标准并链接-lstdc++fs(GCC早期),路径须存在,返回file_time_type需经file_clock转为system_clock才能得到秒级时间戳。

c++怎么获取文件最后修改时间_c++文件属性查询【技巧】

std::filesystem::last_write_time 最直接,但得开 C++17

这是目前最标准、跨平台(Windows/macOS/Linux)的方案,不需要自己调系统 API。前提是编译器支持 C++17 且启用对应标准(如 g++ -std=c++17 或 MSVC /std:c++17)。

常见错误现象:std::filesystem 报 “identifier not found” 或链接失败 —— 大概率是没开 C++17,或者没连 -lstdc++fs(GCC 早期版本需要)。

  • 路径必须存在且可访问,否则抛 std::filesystem::filesystem_error
  • 返回类型是 std::filesystem::file_time_type,不是秒数,不能直接 printf
  • 转成秒级时间戳要经过 std::chrono::system_clock::from_time_t 中转,中间需用 std::chrono::file_clock 转换(C++20 起更简单,但 C++17 需多一步)
try {
    auto ftime = std::filesystem::last_write_time("config.json");
    auto sctp = ftime.time_since_epoch();
    auto duration = std::chrono::duration_cast(sctp);
    time_t tt = duration.count();
    std::cout << ctime(&tt); // 输出可读时间
} catch (const std::filesystem::filesystem_error& e) {
    std::cerr << "Failed: " << e.what() << "\n";
}

Windows 下用 GetFileTime,别漏掉 LocalFileTimeToFileTime

如果项目卡在 C++11/14,或必须精确控制时区/精度(比如要毫秒级、不依赖 CRT),就得调 Win32 API。但这里有个经典坑:API 返回的是 UTC 时间,而 FILETIME 结构体本身不带时区信息,直接转 SYSTEMTIME 再用 mktime 会错。

  • 必须用 FileTimeToLocalFileTime 先转成本地时区的 FILETIME,再转 SYSTEMTIME
  • GetFileTime 的第三个参数是 lpLastWriteTime,别传错位置(顺序是创建、最后访问、最后修改)
  • 手动生成 HANDLE 时记得用 GENERIC_READ 权限,且 FILE_FLAG_BACKUP_SEMANTICS 对目录是必需的

Linux/macOS 用 stat 系统调用,注意 st_mtimst_mtime 的区别

stat() 是最轻量、兼容性最好的方案,所有 POSIX 系统都支持。但结构体字段容易混淆:st_mtime 是秒级整数,st_mtim.tv_nsec 才是纳秒部分 —— 很多人只读前者,丢掉亚秒精度。

SolidPoint
SolidPoint

Youtube视频总结器,快速将Youtube长视频压缩成文字摘要

下载

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

  • struct stat 的 st_mtimstruct timespec 类型(C++11 起),包含 tv_sectv_nsec
  • st_mtime(旧式字段)只能拿到秒,且某些老 libc 可能不填满纳秒位
  • 路径含中文或特殊字符时,确保传入的是正确编码的 char*(UTF-8 on Linux, UTF-8 or CFString on macOS)
struct stat sb;
if (stat("data.bin", &sb) == 0) {
    auto sec = sb.st_mtim.tv_sec;
    auto nsec = sb.st_mtim.tv_nsec;
    std::cout << "Modified at " << sec << "." << nsec << "s\n";
}

跨平台封装要注意时区和精度对齐

如果你写一个通用函数,别指望各平台返回值能直接比较大小 —— Windows 的 FILETIME 是 100ns 单位,Linux 的 tv_nsec 是纳秒,C++17 的 file_time_type 是实现定义周期。最安全的做法是统一转成 std::chrono::system_clock::time_point(即 Unix 时间戳)再比。

  • 不要用 time_t 做中间类型存纳秒级时间,它只保证秒级
  • macOS 上 statst_mtimespec 字段名不同(是 st_mtimespec 而非 st_mtim),需宏判断
  • 硬链接场景下,所有链接共享同一 st_ino 和修改时间,但 std::filesystem::last_write_time 不关心这个,行为一致

真正麻烦的从来不是“怎么取”,而是“取出来之后怎么算、怎么比、怎么显示”。时间单位、时区、精度这三样,漏一个就可能在凌晨两点看到文件“倒退”了两小时。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

76

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

294

2023.11.28

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

322

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

196

2025.07.04

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1024

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1145

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

817

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

457

2023.08.02

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

热门下载

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

精品课程

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

共94课时 | 9.1万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 17万人学习

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

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