Obtenga el tiempo de creación del archivo en milisegundos


13

¿Hay alguna manera de obtener el tiempo de creación de un archivo en Windows con mayor precisión? Quiero obtener el tiempo de creación de un video mp4 en milisegundos. es posible?


Tengo que preguntar por qué necesitas esta precisión.
Moab

1
Grabo algunos datos del sensor en un dispositivo Android junto con un video. Escribí el registro del sensor por mí mismo y registro el tiempo del sistema junto con cada valor del sensor. Para grabar el video utilizo la actividad estándar de la cámara. Después de enviar los datos a una PC, quiero analizarlos. Para fusionar el video con los datos del sensor, debo saber cuándo comenzó el video. Los segundos son demasiado gruesos, así que estoy buscando una manera de obtener una hora de inicio más exacta del video.
Phil

3
Nota: si necesita ese tipo de relación entre dos flujos de datos, generalmente es esencial poner una señal de registro en el flujo (como los viejos tablones utilizados en películas como el director llama "acción". El aplauso fue una señal visual y audio cue, permitiendo que las dos o más corrientes se sincronicen más tarde). En algunas situaciones, el retraso de tiempo entre la creación del archivo en modo kernel (y la grabación de la marca de tiempo) y la activación de su proceso para hacerle saber que tiene un identificador de archivo para usar podría ser realmente mayor que las tolerancias que tiene para sus datos.
Cort Ammon

Cuando copie sus cosas de Android a otro lugar, asegúrese de que todas las herramientas de copia conservan la precisión de la marca de tiempo. Tenga en cuenta que muchas herramientas de copia harán que ctimela copia sea el momento en que se copió.
Peter Cordes

1
En Windows, usaría cygwin / mingw statpara obtener las 3 marcas de tiempo. Por supuesto, eso es porque normalmente uso GNU / Linux.
Peter Cordes

Respuestas:


23

Resolución de marca de tiempo

La marca de tiempo de creación de un archivo en Windows depende del sistema de archivos:

  • FAT / VFAT tiene una resolución máxima de 2 s

  • NTFS tiene una resolución máxima de 100 ns


solución wmic

Puede usar wmicpara recuperar la fecha de creación del archivo al microsegundo más cercano.

Ejemplo:

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

La fecha de creación 20150329221650.080654+060es una marca de tiempo, con el siguiente formato:

yyyymmddHHMMSS.xxxxxxsUUU

dónde:

  • yyyy Año de cuatro dígitos (0000 a 9999).

  • mm Mes de dos dígitos (01 a 12).

  • dd Día de dos dígitos del mes (01 a 31).

  • HH Hora de dos dígitos del día usando el reloj de 24 horas (00 a 23).

  • MM Minuto de dos dígitos en la hora (00 a 59).

  • SS Número de segundos de dos dígitos en el minuto (00 a 59).

  • xxxxxx Número de seis dígitos de microsegundos en el segundo (000000 a 999999)

  • sSigno más ( +) o signo menos ( -) para indicar un desplazamiento positivo o negativo del Tiempo Universal Coordinado (UTC).

  • UUU Desplazamiento de tres dígitos que indica la cantidad de minutos que la zona horaria de origen se desvía de UTC.


solución estadística

También puede usar stat(desde una instalación cygwin o mingw ).

Ejemplo:

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

salida dir para comparación

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

Otras lecturas


@NateEldredge Gracias, bien visto. Respuesta corregida.
DavidPostill

44
Una nota de precaución: solo porque las marcas de tiempo contengan un dígito de alta frecuencia, como el dígito de 100 nanosegundos, no significa que el reloj pueda usarse como una fuente de tiempo confiable en el rango de 100ns. Simplemente establece que hay una gran cantidad de contenido que es [con suerte] monótono y se correlaciona aproximadamente con el tiempo "real".
Cort Ammon

1
Ver msdn CIM_DATETIME : en su notación, xxxxxxes un número de seis dígitos de microsegundos en el segundo (000000 a 999999) . Micro- , es decir 10^-6. Por supuesto, el primer triplete representa mili- ( 10^-3): truncado, no redondeado. El segundo triplete extraído no representa nada en sí mismo ... Sin embargo, algunos wmivalores de fecha y hora muestran 000siempre el segundo triplete , por ejemplowmic OS get LocalDateTime
JosefZ

1
Gracias, este tipo de respuestas es la razón por la que me encanta el intercambio de pila :)
Phil

1
@MarisB. Ah Respuesta actualizada
DavidPostill

1

Aquí se demuestra una manera inteligente: /programming/5180592/showing-ntfs-timestamp-with-100-nsec-granularity

Está utilizando VBScript para consultar la base de datos CIM de WMI y devolver la FILETIMEestructura asociada a un archivo.

También hay herramientas de código abierto que pueden inspeccionar los metadatos de un archivo multimedia, como EXIFtool, que está orientado a administrar los metadatos de los medios creados por las cámaras digitales.


1

Encontré una forma de obtener esto en Matlab:

Puede usar la función GetFileTime escrita por Jan Simon. Si no desea compilar sus propios archivos mex, también puede descargar los archivos compilados aquí .

No es tan exacto como usar wmic (solo ms) pero para mi propósito es adecuado.


-3

Que depende del sistema de archivos : FAT has 2 segunda resolución, NTFS teóricamente tiene 100 ns resolución, pero la actual resolución es de 10 ms . Dicho esto, las interrupciones tienen mayor prioridad que las E / S de disco, y no estoy seguro del efecto que tiene el almacenamiento en caché de escritura en la marca de tiempo. Los temporizadores multimedia están optimizados para la precisión, por lo que sería la forma preferida de implementar el tiempo.

Puede usar una herramienta existente como XYplorer para ver marcas de tiempo de alta resolución, o XYplorer mostrando mspuede preferir escribir su propia aplicación. Utilice el método File.GetCreationTime ; devuelve una estructura de fecha y hora con la propiedad de milisegundos .


1
um ... no para ser grosero, pero, ¿leíste la respuesta de @ DavidPostill?
td512

2
"NTFS teóricamente tiene una resolución de 100 ns, pero la resolución real es de 10 ms " es incorrecta : ese enlace en realidad dice " en NT FAT , el tiempo de creación tiene una resolución de 10 milisegundos". Eso no significa que NTFS tenga esa resolución. Puede ver en mi respuesta que en NTFS wmicmuestra una resolución al microsegundo más cercano .
DavidPostill

Hay una diferencia entre la resolución teórica y la máxima, una indica bien la resolución máxima, la otra indica más una resolución promedio.
Ramhound

1
@DavidPostill Si el reloj solo incrementa el tiempo cada 10 ms, entonces tener una fecha y hora archivada que puede representar 100 n todavía tiene una precisión de solo 10 ms. Las API típicas de UtcNow (a diferencia de los contadores de alto rendimiento que están diseñados para medir las diferencias de tiempo ) incrementan el tiempo cada 0.5-16ms en Windows, por lo que esta respuesta es bastante plausible.
CodesInChaos

@CodesInChaos Sí, pero: "El mejor recurso para recuperar la hora del sistema es la API GetSystemTimeAsFileTime. Es una API de acceso rápido que puede contener valores suficientemente precisos (unidades de 100 ns) en sus argumentos". - No tengo acceso al código fuente de Windows, así que no sé qué llamadas se utilizan debajo del capó al manipular marcas de tiempo de archivo. No sabemos cuál es la resolución real , eso es solo adivinar.
DavidPostill
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.