讲师中心 微信公众号
AI工具推荐 视频效率加速

c++修改文件时间戳方法 c++如何设置文件修改日期

千晨酱_9684

千晨酱_9684

发布时间:2026-03-28 17:41:00

|

296人浏览过

|

来源于php中文网

原创

Windows需用CreateFile以GENERIC_WRITE打开文件,SetFileTime传UTC时间;Linux/macOS推荐utimensat并用UTIME_OMIT/UTIME_NOW;C++跨平台须条件编译,注意libstdc++旧版本不支持std::filesystem::last_write_time写入。

c++修改文件时间戳方法 c++如何设置文件修改日期

Windows 下用 SetFileTime 修改文件时间戳

Windows API 提供了精确控制文件时间戳的能力,但必须注意:需要以写权限打开文件句柄,且不能直接对路径操作。常见错误是传入只读路径或没处理时区——SetFileTime 要求 FILETIME 是 UTC 时间,本地时间不转换会导致时间偏移 8 小时(或对应时区差)。

实操建议:

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 用 CreateFile 打开文件,标志必须含 GENERIC_WRITE,且不能加 FILE_ATTRIBUTE_READONLY
  • 调用 SystemTimeToFileTime 前,先用 TzSpecificLocalTimeToSystemTime 把本地时间转为 UTC
  • 三个时间(创建、访问、修改)可单独设为 NULL,表示不修改该项
  • 修改后记得 CloseHandle,否则句柄泄漏
// 示例:把 file.txt 的修改时间设为 2024-01-01 12:00:00
SYSTEMTIME st = {2024,1,0,1,12,0,0,0};
FILETIME ft;
TzSpecificLocalTimeToSystemTime(NULL, &st, &st);
SystemTimeToFileTime(&st, &ft);
HANDLE h = CreateFile(L"file.txt", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
SetFileTime(h, NULL, NULL, &ft); // 只改最后写入时间
CloseHandle(h);

Linux/macOS 下用 utimes 或 utimensat

utimes 简单但只能到微秒精度,且不支持纳秒;现代代码应优先用 utimensat,它支持纳秒、可指定是否跟随符号链接、还能相对路径操作。容易踩的坑是传入空指针导致时间被设为当前时间——哪怕你只想改一个时间字段,也要显式填好两个字段(tv_sec 和 tv_nsec),未设置项填 UTIME_OMIT。

实操建议:

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

  • 时间结构用 struct timespec[2]:索引 0 是访问时间,索引 1 是修改时间
  • 想保持某时间不变,对应位置填 {.tv_sec = UTIME_OMIT};想设为 now,填 {.tv_sec = UTIME_NOW}
  • 路径用相对路径时,第一个参数传 AT_FDCWD;要避免竞态,加 AT_SYMLINK_NOFOLLOW
  • utimes 接受 struct timeval[2],但已不推荐用于新项目
// 示例:仅修改 file.txt 的 mtime 为 2024-01-01 12:00:00.123456789
struct timespec ts[2] = {
    {.tv_sec = UTIME_OMIT}, // atime 不变
    {.tv_sec = 1704110400, .tv_nsec = 123456789} // mtime
};
utimensat(AT_FDCWD, "file.txt", ts, AT_SYMLINK_NOFOLLOW);

C++ 跨平台封装要注意的兼容性点

没有标准库函数能直接改时间戳,所以跨平台封装必须条件编译。别依赖 std::filesystem::last_write_time 的 setter——它在 libstdc++(GCC)里直到 GCC 13 才真正支持写入,在旧版本中会静默失败或抛 std::filesystem::filesystem_error 且无提示。

实操建议:

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

  • 检查编译器+标准库组合:__GLIBCXX__ 版本 last_write_time 写入不可靠
  • Windows 路径要用宽字符(wchar_t*),Linux/macOS 必须用 UTF-8 编码的 char*,混用会出错
  • 不要假设 time_t 是秒级——Windows 的 FILETIME 是 100 纳秒单位,Linux 的 timespec.tv_nsec 是纳秒,换算时别丢精度
  • 修改系统时间需要管理员/root 权限,普通用户只能改自己有写权限的文件

修改时间戳失败时最常被忽略的原因

错误往往不报具体原因,只返回 false 或 -1。最容易漏查的是文件系统挂载选项:noatime 或 relatime 会让访问时间(atime)无法更新;某些 NFS 或 FAT32 分区根本不支持修改创建时间(ctime)——它由内核在 inode 创建时硬写死,任何 API 调用都无效。

排查建议:

  • 先用命令行验证:touch -m -d "2024-01-01" file.txt,如果命令也失败,问题在环境而非代码
  • 检查 stat file.txt 输出中的 Access:、Modify:、Change: 字段能否被 touch 改动
  • Windows 上用 fsutil behavior query disablelastaccess 查 atime 是否被禁用
  • 对只读文件系统或容器挂载卷,即使有 root 权限也无法修改时间戳

相关文章

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

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

下载

相关标签:

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

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

339

2026.04.23

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

179

2025.11.16

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

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

3179

2023.07.26

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

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

2738

2023.07.27

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

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

1468

2023.08.01

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

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

2499

2023.08.02

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

40

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn