2015-11-07 169 views
5

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中执行此操作?

回答

2

您可以使用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", &times); 

如果传递的修改时间比当前创建时间较旧的的文件,创建时间将被设置。如果您想设置不同的修改时间,则可以再次致电utimes

+0

啊,我错过了第二条信息。如果我理解正确,我只能将出生时间设置为比当前出生时间更早的日期?我不能将它设置为更新的日期吗? –

+1

与当前版本的OS X(我检查10.10)一起提供的'utimes'的手册页是1993年的,它没有提及出生时间的支持。但是,这确实可以在OS X 10.10.5上做一些小改动:而不是'seconds'在'times'数组上使用'tv_sec'。 – hendrik

0

如果您阅读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]); 
1

通过查看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链接,了解必要的内容。

相关问题