我有两个文件路径;两者都指向一个文件,比如'abc.txt'和'folder / cde.txt'
如何使abc.txt具有与其他文件相同的访问时间?
我相信我可以使用stat()
和utime()
,但我尝试过失败。
这是我的代码。
int myLink(const char *oldfile, const char *newfile)
{
int result = link(oldfile, newfile);
int ret; /* return value */
struct stat buf; /* struct to hold file stats */
ret = stat(oldfile, &buf);
if (ret != 0) {
perror("Failed:");
exit(ret);
}
struct utimbuf puttime;
puttime.modtime = buf.st_mtime;
printf("\tatime: %d\n", buf.st_mtime);
if (utime(newfile, &puttime))
perror("utime");
else
{
if (utime(extName, NULL)) /* set to current time */
perror("utime");
}
return result;
}
答案 0 :(得分:2)
假设您有两个文件名,那么您不想使用link()
系统调用。如果由于某种原因你想要链接文件,你需要担心它的返回值(如果第二个文件已经存在则会出错;你必须首先unlink()
新文件名。文件链接后,它们是对同一inode的两个引用,并且不可避免地具有相同的访问时间。
然后,您需要决定是否希望第一个文件具有第二个文件的修改时间,反之亦然,或者您是否希望它们具有相同的其他访问时间(例如现在或某个时间)过去 - 或将来!)。
假设您希望第二个文件的访问时间与第一个文件的访问时间相同(但第二个文件的修改时间不变),那么您需要:
struct utimbuf
结构。utime()
。或者,对于步骤3和4,您可以创建适当的struct timeval
数组,并使用utimes()
。
我很感兴趣(甚至感到困惑)看到POSIX 2008中的struct stat
没有成员st_mtime
,st_atime
和st_ctime
(类型{{1} }})):相反,它具有time_t
类型的st_mtim
,st_atim
和st_ctim
。这些允许在时间戳上进行亚秒级分辨率。我强烈怀疑老成员通常出于向后兼容的原因而存在,如果没有别的话。
我将假设struct timeval
和st_mtime
以及st_atime
(并且没有链接)。这导致修改代码:
utime()
如果您想要诊断打印,可以轻松添加。通常,库函数不应退出程序;它使它们无法使用。诊断打印也存在问题 - 例如,您可能不应该写int myLink(const char *oldfile, const char *newfile)
{
struct stat buf1;
struct stat buf2;
if (stat(oldfile, &buf1) != 0)
return(-1);
if (stat(newfile, &buf2) != 0)
return(-1);
struct utimbuf puttime;
puttime.modtime = buf2.st_mtime;
puttime.acttime = buf1.st_atime;
return utime(newfile, &puttime);
}
。
答案 1 :(得分:1)
如果您创建一个硬链接(使用link
系统调用),那么只有一个文件,它只有一个修改时间和访问时间。它本身并没有什么不同。
$ touch A $ ln A B $ ls -l A B -rw-r--r-- 1 user group 0 Nov 2 0:00 A -rw-r--r-- 1 user group 0 Nov 2 0:00 B $ sleep 60 $ touch B -rw-r--r-- 1 user group 0 Nov 2 0:01 A -rw-r--r-- 1 user group 0 Nov 2 0:01 B
请注意,在上面的示例中,只有一个文件。 A
和B
都是同一个文件。 ln
命令只调用link
。
答案 2 :(得分:0)
您正在使用modtime
而不是atime
而您正在为timespec
分配time_t
。你可能想要:
puttime.actime = buf.st_atim.tv_sec;
^^^^^^