如何使用 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)
根据函数utime
的documentation,struct utimbuf
(你传递给函数utime
)定义如下:
struct utimbuf {
time_t actime; /* access time */
time_t modtime; /* modification time */
};
但是,您只是设置了这个struct
的actime
字段,这意味着当您将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
有关夏令时是否生效的错误信息。这可能会导致文件上的时间戳错误一小时。
我试图更改文件的访问时间,但没有得到我想要的结果。
这是我尝试过的:
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)
根据函数utime
的documentation,struct utimbuf
(你传递给函数utime
)定义如下:
struct utimbuf {
time_t actime; /* access time */
time_t modtime; /* modification time */
};
但是,您只是设置了这个struct
的actime
字段,这意味着当您将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
有关夏令时是否生效的错误信息。这可能会导致文件上的时间戳错误一小时。