改变修改时间

时间:2018-04-07 12:46:07

标签: c

我有我的balanceModTime函数,它应该将目标修改时间设置为源修改时间。调用此函数后会出现问题,它会在两个文件中将修改时间设置为Unknown,有时会在访问时间中设置错误的日期,如1989等。

void balanceModTime(char* destination, char* source) {
struct utimbuf sourceTime;
utime(source, &sourceTime);

struct utimbuf destinationTime;

destinationTime.modtime = sourceTime.modtime;
utime(destination, &destinationTime);
}

导致问题的原因是什么?

1 个答案:

答案 0 :(得分:0)

如评论中所述,您需要通过stat()查找源文件的修改时间,目标文件的访问时间也使用stat(),并使用(obsolescent){{ 3}} 正确设置目的地的修改和访问时间。

这导致代码如下:

/*b SO 4970-7519 */

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

int main(int argc, char **argv)
{
    if (argc != 3)
    {
        fprintf(stderr, "Usage: %s ref-file target-file\n", argv[0]);
        return 1;
    }

    struct stat sb_ref;
    if (stat(argv[1], &sb_ref) != 0)
    {
        fprintf(stderr, "%s: failed to stat file %s\n", argv[0], argv[1]);
        return 1;
    }

    struct stat sb_tgt;
    if (stat(argv[2], &sb_tgt) != 0)
    {
        fprintf(stderr, "%s: failed to stat file %s\n", argv[0], argv[2]);
        return 1;
    }

    struct utimbuf ut = { .actime = sb_tgt.st_atime, .modtime = sb_ref.st_mtime };
    if (utime(argv[2], &ut) != 0)
    {
        fprintf(stderr, "%s: failed to set modification time on %s\n", argv[0], argv[2]);
        return 1;
    }

    return 0;
}

如何证明它有效?这比编写代码要小得多。 您可能需要使用ls -l来查看修改时间,并ls -lu查看访问时间,可能使用-T来显示全部时间(以最特殊的格式)在Mac上)。或者,您可以使用stat命令 - 但它们不容易控制(并且GNU和BSD / macOS版本完全不同)。我选择使用我写的名为fl的命令(文件列表),它允许我控制我看到的信息。

我用过这个脚本:

files="mt47.c get.jl.activity"
touch mt47.c
make mt47

echo;echo;echo
fl -F '%Y-%m-%d %H:%M:%S ' -am $files
ls -lT  $files
ls -luT $files
/usr/bin/stat $files
/opt/gnu/bin/stat $files

mt47 get.jl.activity mt47.c

echo;echo;echo
fl -F '%Y-%m-%d %H:%M:%S ' -am $files
ls -lT  $files
ls -luT $files
/usr/bin/stat $files
/opt/gnu/bin/stat $files

我得到的结果是:

gcc -O3   -g      -I./inc    -std=c11    -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes          -L./lib   mt47.c  -lsoq  -o mt47



2018-04-07 14:32:51  2018-04-07 14:32:51  mt47.c
2017-08-27 08:39:55  2017-03-03 17:06:27  get.jl.activity
-rw-r--r--  1 jleffler  staff  173 Mar  3 17:06:27 2017 get.jl.activity
-rw-r--r--  1 jleffler  staff  825 Apr  7 14:32:51 2018 mt47.c
-rw-r--r--  1 jleffler  staff  173 Aug 27 08:39:55 2017 get.jl.activity
-rw-r--r--  1 jleffler  staff  825 Apr  7 14:32:51 2018 mt47.c
16777220 8614148509 -rw-r--r-- 1 jleffler staff 0 825 "Apr  7 14:32:51 2018" "Apr  7 14:32:51 2018" "Apr  7 14:32:51 2018" "Mar  3 17:06:27 2017" 4194304 8 0 mt47.c
16777220 9176002 -rw-r--r-- 1 jleffler staff 0 173 "Aug 27 08:39:55 2017" "Mar  3 17:06:27 2017" "Jul 22 10:26:30 2017" "Mar  3 17:06:27 2017" 4194304 8 0 get.jl.activity
  File: mt47.c
  Size: 825         Blocks: 8          IO Block: 4194304 regular file
Device: 1000004h/16777220d  Inode: 8614148509  Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/jleffler)   Gid: (   20/   staff)
Access: 2018-04-07 14:32:51.478822831 -0700
Modify: 2018-04-07 14:32:51.301222000 -0700
Change: 2018-04-07 14:32:51.301240604 -0700
 Birth: 2017-03-03 17:06:27.000000000 -0800
  File: get.jl.activity
  Size: 173         Blocks: 8          IO Block: 4194304 regular file
Device: 1000004h/16777220d  Inode: 9176002     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/jleffler)   Gid: (   20/   staff)
Access: 2017-08-27 08:39:55.000000000 -0700
Modify: 2017-03-03 17:06:27.000000000 -0800
Change: 2017-07-22 10:26:30.000000000 -0700
 Birth: 2017-03-03 17:06:27.000000000 -0800



2018-04-07 14:32:51  2017-03-03 17:06:27  mt47.c
2017-08-27 08:39:55  2017-03-03 17:06:27  get.jl.activity
-rw-r--r--  1 jleffler  staff  173 Mar  3 17:06:27 2017 get.jl.activity
-rw-r--r--  1 jleffler  staff  825 Mar  3 17:06:27 2017 mt47.c
-rw-r--r--  1 jleffler  staff  173 Aug 27 08:39:55 2017 get.jl.activity
-rw-r--r--  1 jleffler  staff  825 Apr  7 14:32:51 2018 mt47.c
16777220 8614148509 -rw-r--r-- 1 jleffler staff 0 825 "Apr  7 14:32:51 2018" "Mar  3 17:06:27 2017" "Apr  7 14:32:51 2018" "Mar  3 17:06:27 2017" 4194304 8 0 mt47.c
16777220 9176002 -rw-r--r-- 1 jleffler staff 0 173 "Aug 27 08:39:55 2017" "Mar  3 17:06:27 2017" "Jul 22 10:26:30 2017" "Mar  3 17:06:27 2017" 4194304 8 0 get.jl.activity
  File: mt47.c
  Size: 825         Blocks: 8          IO Block: 4194304 regular file
Device: 1000004h/16777220d  Inode: 8614148509  Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/jleffler)   Gid: (   20/   staff)
Access: 2018-04-07 14:32:51.000000000 -0700
Modify: 2017-03-03 17:06:27.000000000 -0800
Change: 2018-04-07 14:32:51.514236142 -0700
 Birth: 2017-03-03 17:06:27.000000000 -0800
  File: get.jl.activity
  Size: 173         Blocks: 8          IO Block: 4194304 regular file
Device: 1000004h/16777220d  Inode: 9176002     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/jleffler)   Gid: (   20/   staff)
Access: 2017-08-27 08:39:55.000000000 -0700
Modify: 2017-03-03 17:06:27.000000000 -0800
Change: 2017-07-22 10:26:30.000000000 -0700
 Birth: 2017-03-03 17:06:27.000000000 -0800

我很满意地证明mt47.c中的代码(如上所示)完成了我打算做的事情。它还告诉我为什么写fl