2011-12-08 6 views
8

Sto provando a impostare il tempo di creazione del filesystem per un file su Mac OS usando uno script ruby.Come posso impostare un tempo di creazione del file con ruby ​​su Mac OS?

Su Mac OS X il 'ctime' rappresenta l'ultima volta della modifica di inode piuttosto che il tempo di creazione del file, quindi utilizzare File.utime() di Ruby per impostare ctime non sarà di aiuto.

Usando questo suggerimento [http://inessential.com/2008/12/18/file_creation_date_in_ruby_on_macs] posso recuperare il tempo la creazione di un file:

Time.parse(`mdls -name kMDItemContentCreationDate -raw "#{filename}"`) 

... ma qualsiasi idea su come impostare utilizzando rubino?

- AGGIORNAMENTO -

Va bene, penso di poter effettivamente fare questo con File.utime in Ruby.

Anche se il ctime è tecnicamente non utilizzato da Mac OS a tenere traccia del tempo di creazione del file, quando si utilizza utime di aggiornare il ctime (insieme al mtime, che deve essere impostato allo stesso tempo) il file system sembra magicamente aggiornare anche il tempo di creazione come da kMDItemContentCreationDate.

Quindi, per impostare il nome del file ad un ctime di 1 ott 2010 ed un mtime del 2 ottobre 2010:

File.utime(Time.strptime('011010', '%d%m%y'), Time.strptime('021010', '%d%m%y'), filename) 
+1

si potrebbe desiderare di inviare il tuo 'aggiornamento' soluzione come risposta, quindi questa domanda non ha bisogno di rimanere aperta (e 'senza risposta') – robustus

+0

Capisci che questo non è portatile. Linux non supporta la memorizzazione di un tempo di creazione. Inoltre ctime non è il tempo di creazione, è il tempo di "modifica" in base alla directory, non per il file stesso. Questo potrebbe spiegarlo: http://stackoverflow.com/a/4009369/128421 –

+1

L'impostazione delle ore di file usando 'utime' NON modifica il valore restituito usando' mdls -name kMDItemContentCreationDate -raw'. –

risposta

11

Esiste una soluzione Ruby con il metodo utime. Ma dovrai impostare il tempo di modifica (mtime) e il tempo di accesso (atime) allo stesso tempo. Se si desidera mantenere il tempo di accesso è possibile utilizzare:

File.utime(File.atime(path), modification_time, path) 

Vedi Ruby core documentation pure.

+3

Questo non aggiorna la data di creazione –

+0

Se si esegue 'stat -s' su quel file, si vedrà che questo non aggiorna la proprietà' st_ctime'. – fotinakis

3

Così avete sicuramente trovato una soluzione di lavoro puro Ruby, ma poiché questa è OS X , sei contrario a exec() o system() e semplicemente usando touch? Nel tuo caso, mi piacerebbe quasi preferisco:

system "touch -t YYYYMMDDhhmm /what/ever" 

se per nessun altro motivo che chiarezza.

+0

'touch' non usa lo stesso meccanismo che' mdls -name kMDItemContentCreationDate -raw' fa. –

1

Questo funziona per me, per aggiornare il tempo di creazione su OS X 10.11.1:

system "SetFile -d '#{time.strftime "%m/%d/%Y %H:%M:%S"}' #{file}" 

Nessuna richiesta di portabilità - SetFile è un comando OS X (e la pagina man dice che è deprecato con XCode 6, in modo da potrebbe non funzionare per molto tempo) - non è stato possibile trovare un altro modo per farlo, Time.utime non ha aggiornato il tempo di creazione, ma solo il tempo di accesso e modificato.

Vedi: https://apple.stackexchange.com/q/99536/65787

0

Rubino utilizza la chiamata di sistema utimes di modificare i file-volte.

Leggendo la pagina man per utimes spiega cosa succede:

int utimes (const char * percorso, const struct timeval * volte); .. 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. Per i file system che supportano i tempi di nascita (creazione) dei file (come UFS2), il tempo di nascita verrà impostato sul valore del secondo elemento se il secondo elemento è precedente all'ora di nascita attualmente impostata. Per impostare sia il tempo di nascita e un tempo di modifica, sono necessarie due chiamate; il primo per impostare l'orario di nascita e il secondo per impostare la modifica (presumibilmente più recente) . ...

Quindi ctime viene aggiornato solo indietro nel tempo.

Problemi correlati