Ottieni il tempo di creazione del file in millisecondi


13

C'è un modo per ottenere i tempi di creazione di un file in Windows con una precisione maggiore? Voglio ottenere il tempo di creazione di un video mp4 in millisecondi. È possibile?


Devo chiederti perché hai bisogno di questa precisione?
Moab,

1
Registro alcuni dati del sensore su un dispositivo Android insieme a un video. Ho scritto la registrazione del sensore da solo e ho registrato l'ora del sistema insieme a ciascun valore del sensore. Per la registrazione del video utilizzo l'attività della fotocamera standard. Dopo aver inviato i dati a un PC, voglio analizzarli. Per unire il video con i dati del sensore, devo sapere quando è iniziato il video. I secondi sono un po 'troppo approssimativi, quindi sto cercando un modo per ottenere un orario di inizio più preciso del video.
Phil

3
Nota: se hai bisogno di quel tipo di relazione tra due flussi di dati, di solito è essenziale inserire un segnale di registrazione nel flusso (come i vecchi assicelle usati nei film come il regista chiama "azione". Il battito era un segnale visivo e audio cue, consentendo in seguito la sincronizzazione dei due o più stream). In alcune situazioni, il ritardo tra la creazione del file in modalità kernel (e la registrazione del timestamp) e il riattivazione del processo per fargli sapere che ha un handle di file da utilizzare potrebbe effettivamente essere superiore alle tolleranze che hai per i tuoi dati.
Cort Ammon,

Quando copi le tue cose da Android in qualche altro luogo, assicurati che tutti gli strumenti di copia mantengano la precisione del timestamp. Si noti che molti strumenti di copia faranno diventare ctimela copia il momento in cui è stata copiata.
Peter Cordes,

1
Su Windows, userei cygwin / mingw statper ottenere tutti e 3 i timestamp. Certo, è perché normalmente uso GNU / Linux.
Peter Cordes,

Risposte:


23

Risoluzione data / ora

Il timestamp di creazione di un file in Windows dipende dal file system:

  • FAT / VFAT ha una risoluzione massima di 2 secondi

  • NTFS ha una risoluzione massima di 100 ns


soluzione wmic

È possibile utilizzare wmicper recuperare la data di creazione del file al microsecondo più vicino.

Esempio:

F:\test>wmic datafile where name="f:\\test\\test.txt" get creationdate | findstr /brc:[0-9]
20150329221650.080654+060

La data di creazione 20150329221650.080654+060è un timestamp, con il seguente formato:

yyyymmddHHMMSS.xxxxxxsUUU

dove:

  • yyyy Anno a quattro cifre (da 0000 a 9999).

  • mm Mese a due cifre (da 01 a 12).

  • dd Giorno del mese a due cifre (da 01 a 31).

  • HH Ora del giorno a due cifre utilizzando l'orologio a 24 ore (da 00 a 23).

  • MM Minuti di due cifre nell'ora (da 00 a 59).

  • SS Numero di secondi di due cifre al minuto (da 00 a 59).

  • xxxxxx Numero a sei cifre di microsecondi nel secondo (da 000000 a 999999)

  • sSegno più ( +) o segno meno ( -) per indicare un offset positivo o negativo rispetto a Coordinated Universal Times (UTC).

  • UUU Offset a tre cifre che indica il numero di minuti in cui il fuso orario di origine si discosta da UTC.


soluzione stat

Puoi anche usare stat(da un cygwin o un'installazione mingw ).

Esempio:

DavidPostill@Hal /f/test
$ stat test.txt | grep Birth
 Birth: 2015-03-29 22:16:50.080654200 +0100

output dir per confronto

F:\test>dir /t:c test.txt
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

29/03/2015  22:16                32 test.txt
               1 File(s)             32 bytes
               0 Dir(s)  1,798,546,849,792 bytes free

Ulteriori letture


@NateEldredge Grazie, ben individuato. Risposta corretta
DavidPostill

4
Una nota di cautela: solo perché un timestamp contiene una cifra ad alta frequenza, come la cifra di 100 nanosecondi, non significa che l'orologio può essere utilizzato come una fonte di tempo affidabile nell'intervallo di 100 ns. Dichiara semplicemente che ci sono molti frammenti di contenuto che è [si spera] monotonico e che si correla approssimativamente al tempo "reale".
Cort Ammon,

1
Vedi msdn CIM_DATETIME : nella tua notazione, xxxxxxè un numero di sei cifre di microsecondi nel secondo (da 000000 a 999999) . Micro- , cioè 10^-6. Naturalmente, la prima tripletta rappresenta mili- ( 10^-3): troncato, non arrotondato. La seconda terzina estratta non rappresenta nulla in sé ... Tuttavia, alcuni wmivalori datetime mostrano sempre la seconda terzina 000, ad es.wmic OS get LocalDateTime
JosefZ

1
Grazie, questo tipo di risposte è il motivo per cui adoro lo scambio di stack :)
Phil

1
@MarisB. Ah. Risposta aggiornata
DavidPostill


1

Ho trovato un modo per ottenerlo in Matlab:

Puoi usare la funzione GetFileTime scritta da Jan Simon. Se non vuoi compilare i tuoi file mex, puoi anche scaricare i file compilati qui .

Non è esatto come usare wmic (solo ms) ma per il mio scopo è adatto.


-3

Essa dipende dal file system : FAT ha due secondi risoluzione, NTFS teoricamente ha una risoluzione di 100 ns, ma l'attuale risoluzione è di 10 ms . Detto questo, gli interrupt hanno una priorità maggiore rispetto all'I / O del disco e non sono sicuro dell'effetto della scrittura nella cache sul timestamp.I timer multimediali sono ottimizzati per la precisione, quindi sarebbe il modo preferito per implementare il timing.

È possibile utilizzare uno strumento esistente come XYplorer per visualizzare i timestamp ad alta risoluzione oppure XYplorer mostra mssi può preferire scrivere la propria applicazione. Utilizzare il metodo File.GetCreationTime ; restituisce una struttura DateTime con proprietà Millisecond .


1
um ... non per essere scortese, ma hai letto la risposta di DavidPostill?
td512

2
"NTFS ha teoricamente una risoluzione di 100 ns, ma la risoluzione effettiva è di 10 ms " non è corretta - quel collegamento in realtà dice " su NT FAT , il tempo di creazione ha una risoluzione di 10 millisecondi". Ciò non significa che NTFS abbia quella risoluzione. Dalla mia risposta puoi vedere che su NTFS wmicmostra una risoluzione al microsecondo più vicino .
DavidPostill

C'è una differenza tra la risoluzione teorica e massima, una indica bene la risoluzione massima, l'altra indica, più di una risoluzione media.
Ramhound,

1
@DavidPostill Se l'orologio aumenta solo il tempo ogni 10 ms, allora avere un datetime archiviato che può rappresentare 100 n ha ancora una precisione di soli 10 ms. Le tipiche API UtcNow (al contrario dei contatori ad alte prestazioni progettati per misurare le differenze di tempo ) aumentano il tempo ogni 0,5-16 ms su Windows, quindi questa risposta è abbastanza plausibile.
Codici A Caos l'

@CodesInChaos Sì, ma - "La migliore risorsa per recuperare l'ora del sistema è l'API GetSystemTimeAsFileTime. È un'API ad accesso rapido in grado di contenere valori sufficientemente accurati (100 ns unità) nei suoi argomenti." - Non ho accesso al codice sorgente di Windows, quindi non so quali chiamate vengono utilizzate sotto il cofano durante la manipolazione dei timestamp dei file. Non sappiamo quale sia la risoluzione effettiva - è solo un'ipotesi.
David Post
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.