Mac OS X存储文件创建时间,我知道如何使用stat()
从<sys/stat.h>
中读取它。如何在Mac OS X中设置C文件的创建日期?
我不能找到一种方法,如何设置创作时间C.必须能够以某种方式,如公用事业SetFile
可以做到这一点(SetFile
是来自苹果的命令行工具包的一部分):
SetFile -d '12/31/1999 23:59:59' file.txt
如何在C中执行此操作?
Mac OS X存储文件创建时间,我知道如何使用stat()
从<sys/stat.h>
中读取它。如何在Mac OS X中设置C文件的创建日期?
我不能找到一种方法,如何设置创作时间C.必须能够以某种方式,如公用事业SetFile
可以做到这一点(SetFile
是来自苹果的命令行工具包的一部分):
SetFile -d '12/31/1999 23:59:59' file.txt
如何在C中执行此操作?
您可以使用utimes。
如果时间不是NULL,则假定它指向一个包含两个timeval 结构的数组。访问时间设置为第一个元素的值 ,修改时间设置为第二个元素的值。
和:
对于支持文件出生(创建)倍(如UFS2) 文件系统中, 分娩时间将被设置为如果所述第二 所述第二元件的值元素比当前设定的出生时间早。要设置出生时间 和修改时间,需要两个调用;第一设置 出生的时间和所述第二设定(假定更新的)修改 时间
作为一个例子:
struct timeval times[2];
memset(times, 0, sizeof(times));
times[0].seconds = 946684799; /* 31 Dec 1999 23:59:59 */
times[1].seconds = 946684799;
utimes("/path/to/file", ×);
如果传递的修改时间比当前创建时间较旧的的文件,创建时间将被设置。如果您想设置不同的修改时间,则可以再次致电utimes
。
如果您阅读stat(2)手册页,它指的是SEE ALSO部分中的utimes(2)。
NAME
futimes, utimes -- set file access and modification times
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <sys/time.h>
int
futimes(int fildes, const struct timeval times[2]);
int
utimes(const char *path, const struct timeval times[2]);
通过查看osxfuse回送文件系统如何实现设定制作时间在这里: https://github.com/osxfuse/filesystems/blob/master/filesystems-c/loopback/loopback.c
看来你需要使用setattrlist(): https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man2/setattrlist.2.html
似乎(从loopback.c)的代码会沿线:
struct attrlist attributes;
attributes.bitmapcount = ATTR_BIT_MAP_COUNT;
attributes.reserved = 0;
attributes.commonattr = ATTR_CMN_CRTIME;
attributes.dirattr = 0;
attributes.fileattr = 0;
attributes.forkattr = 0;
attributes.volattr = 0;
res = setattrlist(path, &attributes, &crtime,
sizeof(struct timespec), FSOPT_NOFOLLOW);
其中“crtime”是结构timespec。请参阅上面的man链接,了解必要的内容。
啊,我错过了第二条信息。如果我理解正确,我只能将出生时间设置为比当前出生时间更早的日期?我不能将它设置为更新的日期吗? –
与当前版本的OS X(我检查10.10)一起提供的'utimes'的手册页是1993年的,它没有提及出生时间的支持。但是,这确实可以在OS X 10.10.5上做一些小改动:而不是'seconds'在'times'数组上使用'tv_sec'。 – hendrik