我有我的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);
}
导致问题的原因是什么?
答案 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
。