2015-11-07 14 views
5

Mac OS X przechowuje czas utworzenia pliku i wiem, jak go odczytać za pomocą stat() z <sys/stat.h>.Jak ustawić datę utworzenia pliku w C w systemie Mac OS X?

nie mogłem znaleźć sposób, jak ustawić czas tworzenia w C. Musi być możliwe jakoś, jako narzędzia SetFile może to zrobić (SetFile jest częścią pakietu narzędzi wiersza polecenia firmy Apple):

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

Jak mogę to zrobić w C?

Odpowiedz

2

Można użyć utimes.

Jeżeli czas jest niezerowe, to zakłada się wskazywać tablicę dwóch timeval struktur. Czas dostępu jest ustawiony na wartość pierwszego elementu, , a czas modyfikacji jest ustawiony na wartość drugiego elementu.

I:

Dla systemów plików, które obsługują plików narodziny (tworzenie) razy (takie jak UFS2), czas urodzenie zostanie ustawiona na wartość drugiego elementu jeśli drugi element jest starszy niż obecnie ustawiony czas porodu. Aby ustawić zarówno czas urodzenia, jak i czas modyfikacji, wymagane są dwa połączenia; pierwszy set czas urodzenia, a drugi do ustawienia (przypuszczalnie nowszej) modyfikację czasu

Jako przykład:

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

Jeżeli czas modyfikacji przekazywana jest starszy niż aktualny czas tworzenia pliku, czas utworzenia zostanie ustawiony. Następnie możesz ponownie zadzwonić pod numer utimes, jeśli chcesz ustawić inny czas modyfikacji.

+0

Ah, brakowało mi drugiej informacji. Jeśli dobrze rozumiem, mogę ustawić czas urodzenia na starszą datę niż obecny czas urodzenia? Nie mogę ustawić go na nowszą datę? –

+1

Strona podręczna dla 'utimes', która jest dostarczana z aktualnymi wersjami OS X (sprawdziłem 10.10), pochodzi z 1993 roku i nie wspomina o wsparciu czasu porodu. Jednak faktycznie działa to w systemie OS X 10.10.5 z drobną zmianą: zamiast 'sekund' użyj' tv_sec' w tablicy 'times'. – hendrik

0

Jeśli czytasz stronę ze stat (2), odnosi się ona do utimes (2) w sekcji SEE ASSO.

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

Patrząc jak osxfuse loopback plików implementuje ustawienie czasu tworzenia tutaj: https://github.com/osxfuse/filesystems/blob/master/filesystems-c/loopback/loopback.c

Wydaje się, że trzeba użyć setattrlist(): https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man2/setattrlist.2.html

wydaje (od loopback.c) kod będzie być na linii:

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

Gdzie "crtime" to struct timespec. Zobacz odnośnik man powyżej, aby uzyskać niezbędne informacje.

Powiązane problemy