如何使用C使两个文件具有相同的访问时间?

时间:2011-11-03 06:37:29

标签: c linux filesystems

我有两个文件路径;两者都指向一个文件,比如'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;
}

3 个答案:

答案 0 :(得分:2)

假设您有两个文件名,那么您不想使用link()系统调用。如果由于某种原因你想要链接文件,你需要担心它的返回值(如果第二个文件已经存在则会出错;你必须首先unlink()新文件名。文件链接后,它们是对同一inode的两个引用,并且不可避免地具有相同的访问时间。

然后,您需要决定是否希望第一个文件具有第二个文件的修改时间,反之亦然,或者您是否希望它们具有相同的其他访问时间(例如现在或某个时间)过去 - 或将来!)。

假设您希望第二个文件的访问时间与第一个文件的访问时间相同(但第二个文件的修改时间不变),那么您需要:

  1. 收集第一个文件的时间。
  2. 收集第二个文件的时间。
  3. 创建适当的struct utimbuf结构。
  4. 致电utime()
  5. 或者,对于步骤3和4,您可以创建适当的struct timeval数组,并使用utimes()

    我很感兴趣(甚至感到困惑)看到POSIX 2008中的struct stat没有成员st_mtimest_atimest_ctime(类型{{1} }})):相反,它具有time_t类型的st_mtimst_atimst_ctim。这些允许在时间戳上进行亚秒级分辨率。我强烈怀疑老成员通常出于向后兼容的原因而存在,如果没有别的话。

    我将假设struct timevalst_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

请注意,在上面的示例中,只有一个文件。 AB都是同一个文件。 ln命令只调用link

答案 2 :(得分:0)

您正在使用modtime而不是atime而您正在为timespec分配time_t。你可能想要:

puttime.actime = buf.st_atim.tv_sec;
                              ^^^^^^