2015-11-07 17 views
5

Mac OS X memorizza il tempo di creazione del file e so come leggerlo con stat() da <sys/stat.h>.Come impostare la data di creazione di un file in C in Mac OS X?

non riuscivo a trovare un modo, come impostare l'ora di creazione in C. Deve essere possibile in qualche modo, come l'utilità SetFile può farlo (SetFile fa parte del pacchetto di strumenti a linea di comando da Apple):

SetFile -d '12/31/1999 23:59:59' file.txt 

Come posso farlo in C?

risposta

2

È possibile utilizzare utimes.

Se i tempi non sono NULL, si presume che puntino a una matrice di due strutture temporali . Il tempo di accesso è impostato sul valore del primo elemento, e il tempo di modifica è impostato sul valore del secondo elemento.

E:

Per i file system che supportano file di nascita (creazione) volte (come ad esempio UFS2), il tempo di nascita sarà impostato al valore del secondo elemento se il secondo elemento è più vecchio del tempo di nascita attualmente impostato. Per impostare sia il tempo di nascita e un tempo di modifica, sono necessarie due chiamate; il primo per impostare il tempo di nascita e il secondo per impostare il (presumibilmente più recente) modifica tempo

Per fare un esempio:

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); 

Se la data di modifica passato è più vecchio del tempo di creazione corrente del file, verrà impostato il tempo di creazione. È quindi possibile chiamare di nuovo utimes se si desidera impostare un orario di modifica diverso.

+0

Ah, mi mancava la seconda informazione. Se capisco correttamente, posso solo impostare il tempo di nascita su una data più vecchia rispetto all'ora di nascita corrente? Non posso impostarlo su una data più recente? –

+1

La pagina di manuale per 'utimes' che viene fornita con le versioni correnti di OS X (ho controllato 10.10), è del 1993 e non menziona il supporto del tempo di nascita. Tuttavia, questo funziona davvero su OS X 10.10.5 con una piccola modifica: invece di 'secondi' usa' tv_sec' sulla matrice 'times'. – hendrik

0

Se si legge la man-page stat (2), fa riferimento a utimes (2) nella sezione VEDERE ANCHE.

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

Guardando come osxfuse loopback file system implementa impostando l'ora di creazione qui: https://github.com/osxfuse/filesystems/blob/master/filesystems-c/loopback/loopback.c

Sembra che è necessario utilizzare setattrlist(): https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man2/setattrlist.2.html

Sembra (dal loopback.c) il codice sarebbe essere sulla falsariga di:

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); 

Dove "crtime" è struct timespec. Vedi il link man sopra per gli include necessari.