You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

balanceModTime函数修改文件修改时间异常问题求助

问题分析与修复方案

首先得说,你这段代码的核心问题是搞反了utime的用法,直接把源文件的时间给改坏了,难怪两个文件时间都不对,甚至出现1989年这种离谱的日期。

问题出在哪?

你写的utime(source, &sourceTime)这行代码,是在设置源文件的时间,而不是读取它!因为当utime的第二个参数不为NULL时,它会用这个结构体里的值去覆盖文件的访问和修改时间。但你声明的sourceTime根本没初始化,里面是内存里的随机垃圾值,这就导致源文件的时间被改成了一堆无效值——有时候是工具无法识别的Unknown,有时候刚好对应1989年的时间戳,都是这个原因。

而且你后面的utime(destination, &destinationTime...就算写完,用的也是这个垃圾值,目标文件自然也跟着错了。

正确的实现方式

要同步源文件到目标文件的修改时间,应该先读取源文件的时间,再把这个时间赋值给目标文件。我们可以用stat函数来获取源文件的元数据(包括时间戳),再用utime去设置目标文件的时间。

修复后的代码如下:

#include <sys/stat.h>
#include <utime.h>
#include <stdio.h>

void balanceModTime(char* destination, char* source) {
    struct stat sourceStat;
    // 第一步:获取源文件的状态信息(包含时间戳)
    if (stat(source, &sourceStat) == -1) {
        perror("Failed to get source file status");
        return;
    }

    struct utimbuf destTime;
    // 复制源文件的访问时间和修改时间
    destTime.actime = sourceStat.st_atime;  // 访问时间
    destTime.modtime = sourceStat.st_mtime; // 修改时间

    // 第二步:设置目标文件的时间
    if (utime(destination, &destTime) == -1) {
        perror("Failed to set destination file time");
        return;
    }
}

关键细节说明

  • 用stat读取时间:stat是专门用来获取文件元数据的函数,不会修改源文件本身,这才是正确的读取方式。
  • 检查返回值:添加perror错误提示,能帮你快速排查问题(比如文件不存在、权限不足等)。
  • 完整赋值utimbuf:struct utimbuf需要同时设置actime和modtime,如果只赋值其中一个,另一个会是未初始化的垃圾值,导致目标文件的访问时间出错。如果你只想同步修改时间,不想动访问时间,可以先stat目标文件,保留它的st_atime再赋值。

内容的提问来源于stack exchange,提问作者gypsy0ne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:45:06