如何使用 utime 和 mktime 系统调用和 C++ 更改文件的访问时间?

how to change access time of a file using utime and mktime syscalls and c++?

我试图更改文件的访问时间,但没有得到我想要的结果。

这是我尝试过的:

struct tm time;
    time.tm_sec=56;
    time.tm_min=48;
    time.tm_hour=20;
    time.tm_mday=12;
    time.tm_mon=8;
    time.tm_year=1905;
struct utimbuf utime_par;
utime_par.actime=mktime(&time);
if(utime("file_name",&utime_par)!=0)
    {
    
      perror("smash error: utime failed");
      std::cout<<"entered";
      return;
    }

当我 运行 在 linux 终端上时

ls -l file_name

我明白了

-rwxrw-rw- 1 student student 3133 Jun 20  4461763 README.txt

有人知道我做错了什么吗?

我认为您已成功更新 file_name 的访问时间,但您未能通过 ls 检查结果。

我复制了你的代码,成功修改了我文件的访问时间

问题是:

ls -l file_name

ls 显示 mtime — 在文件内容更改时更新。在大多数情况下,这是“默认”文件时间。 但我猜你没有改变你文件的文件内容

你应该做的是:

ls -l --time=atime your-file-name

--time是什么意思?您可以通过 man ls

查看其含义
       --time=WORD
              change the default of using modification times; access time (-u): atime, access, use; change time (-c): ctime, status; birth time: birth, creation;

              with -l, WORD determines which time to show; with --sort=time, sort by WORD (newest first)

根据函数utimedocumentationstruct utimbuf(你传递给函数utime)定义如下:

struct utimbuf {
    time_t actime;       /* access time */
    time_t modtime;      /* modification time */
};

但是,您只是设置了这个structactime字段,这意味着当您将modtime字段传递给函数[=13]时,该字段具有不确定的值=].

在您的情况下,您可能希望将两个字段设置为相同的时间值:

utime_par.actime  = mktime( &time );
utime_par.modtime = mktime( &time );

或者,如果你不想调用函数mktime两次(有点低效),你也可以这样写:

utime_par.actime  = mktime( &time );
utime_par.modtime = time_par.actime;

此外,正如评论部分已经指出的那样,struct tm 中的字段 tm_year 不应是绝对年份,而是距 [=23= 年份的年数].因此,您将 1905 写入此字段可能是错误的,因为它对应于年份 3805.

另一个问题是您应该在 struct tm 中设置字段 tm_isdst 以指示夏令时是否生效。您可以简单地将此字段设置为负值,这将告诉 mktime 您没有提供此信息,因此它应该自行确定。如果不设置此字段,则此字段的值将不确定,这意味着您可能会提供 mktime 有关夏令时是否生效的错误信息。这可能会导致文件上的时间戳错误一小时。