Obtenir le temps de création du fichier en millisecondes


13

Existe-t-il un moyen d'obtenir plus de précision lors de la création d'un fichier dans Windows? Je veux obtenir le temps de création d'une vidéo MP4 en millisecondes. Est-ce possible?


Je dois demander pourquoi vous avez besoin de cette précision?
Moab

1
J'enregistre des données de capteur sur un appareil Android avec une vidéo. J'ai écrit moi-même l'enregistrement du capteur et consigné l'heure du système avec chaque valeur de capteur. Pour enregistrer la vidéo, j'utilise l'activité de caméra standard. Après avoir envoyé les données à un PC, je souhaite les analyser. Pour fusionner la vidéo avec les données du capteur, je dois savoir quand la vidéo a commencé. Les secondes sont un peu trop grossières alors je cherche un moyen d'obtenir une heure de début plus précise de la vidéo.
Phil

3
Remarque: si vous avez besoin de ce type de relation entre deux flux de données, il est généralement essentiel de placer un signal d’enregistrement dans le flux (comme les vieux clapboards utilisés dans les films lorsque le réalisateur appelle "action". cue, permettant aux deux flux ou plus d'être synchronisés plus tard). Dans certaines situations, le délai entre la création du fichier en mode noyau (et l'enregistrement de l'horodatage) et le réveil de votre processus pour lui faire savoir qu'il dispose d'un descripteur de fichier à utiliser peut en réalité être supérieur aux tolérances que vous avez pour vos données.
Cort Ammon

Lorsque vous copiez vos données depuis Android vers un autre site, assurez-vous que tous les outils de copie conservent la précision de l'horodatage. Notez que de nombreux outils de copie font en sorte que ctimela copie soit à l'heure de sa copie.
Peter Cordes

1
Sous Windows, j'utilisais cygwin / mingw statpour obtenir les 3 horodatages. Bien sûr, c'est parce que j'utilise normalement GNU / Linux.
Peter Cordes

Réponses:


22

Résolution d'horodatage

L'horodatage de création d'un fichier dans Windows dépend du système de fichiers:

  • FAT / VFAT a une résolution maximale de 2s

  • NTFS a une résolution maximale de 100 ns


solution wmic

Vous pouvez utiliser wmicpour récupérer la date de création du fichier à la microseconde près.

Exemple:

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

Creationdate 20150329221650.080654+060est un horodatage, au format suivant:

yyyymmddHHMMSS.xxxxxxsUUU

où:

  • yyyy Année à quatre chiffres (0000 à 9999).

  • mm Mois à deux chiffres (01 à 12).

  • dd Jour du mois à deux chiffres (01 à 31).

  • HH Heure du jour à deux chiffres en utilisant l'horloge de 24 heures (00 à 23).

  • MM Minutes à deux chiffres dans l'heure (00 à 59).

  • SS Nombre de secondes à deux chiffres dans la minute (00 à 59).

  • xxxxxx Nombre de microsecondes à six chiffres dans la seconde (000000 à 999999)

  • sSigne plus ( +) ou signe moins ( -) pour indiquer un décalage positif ou négatif par rapport au temps universel coordonné (UTC).

  • UUU Décalage à trois chiffres indiquant le nombre de minutes pendant lesquelles le fuseau horaire d’origine est différent de UTC.


solution de statistique

Vous pouvez également utiliser stat(depuis une installation cygwin ou mingw ).

Exemple:

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

sortie dir pour comparaison

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

Lectures complémentaires


@NateEldredge Merci, bien repéré. Réponse corrigée.
DavidPostill

4
Attention: le fait qu'un horodatage contienne un chiffre haute fréquence, tel que celui de 100 nanosecondes, ne signifie pas que l'horloge peut être utilisée comme source de temps fiable dans la plage des 100 ns. Il indique simplement qu'il y a beaucoup de contenus qui sont [espérons-le] monotones et qui correspondent approximativement au temps "réel".
Cort Ammon

1
Voir msdn CIM_DATETIME : dans votre notation, xxxxxxest le nombre à six chiffres de microsecondes dans la seconde (000000 à 999999) . Micro , c'est à dire 10^-6. Bien sûr, le premier triplet représente mili- ( 10^-3): tronqué, non arrondi. Le deuxième triplet extrait ne représente rien en soi ... Cependant, certaines wmivaleurs datetime indiquent 000toujours le deuxième triplet , par exemplewmic OS get LocalDateTime
JosefZ

1
Merci, ce genre de réponses est la raison pour laquelle j'aime l'échange de pile :)
Phil

1
@MarisB. Ah Réponse mise à jour.
DavidPostill

1

Une manière intelligente est démontrée ici: https://stackoverflow.com/questions/5180592/showing-ntfs-timestamp-with-100-nsec-granularity

Il utilise VBScript pour interroger la base de données CIM de WMI et renvoyer la FILETIMEstructure associée à un fichier.

Il existe également des outils open source permettant d'inspecter les métadonnées d'un fichier multimédia, tels que EXIFtool, conçu pour la gestion des métadonnées des médias créés par des appareils photo numériques.


1

J'ai trouvé un moyen d'obtenir ceci dans Matlab:

Vous pouvez utiliser la fonction GetFileTime écrite par Jan Simon. Si vous ne voulez pas compiler vos propres fichiers mex, vous pouvez également télécharger les fichiers compilés ici .

Ce n'est pas aussi précis que d'utiliser wmic (seulement ms) mais cela convient à mon propos.


-3

Cela dépend du système de fichiers : FAT a une résolution de 2 secondes, NTFS a théoriquement une résolution de 100 ns, mais la résolution réelle est de 10 ms . Cela dit, les interruptions ont une priorité plus élevée que les E / S de disque et je ne suis pas sûr que l'effet de la mise en cache en écriture ait sur l'horodatage. Les minuteries multimédias sont optimisées pour la précision, ce serait donc le moyen préféré d’implémenter la synchronisation.

Vous pouvez utiliser un outil existant tel que XYplorer pour afficher des horodatages haute résolution, ou bien XYplorer montrant ms, vous pouvez préférer écrire votre propre application. Utilisez la méthode File.GetCreationTime ; il retourne une structure DateTime avec la propriété Millisecond .


1
euh ... ne soyez pas impoli, mais avez-vous lu la réponse de DavidPostill?
td512

2
"NTFS a théoriquement une résolution de 100 ns, mais la résolution réelle est de 10 ms " est incorrect - ce lien indique en fait " sur NT FAT , le temps de création a une résolution de 10 millisecondes". Cela ne signifie pas que NTFS a cette résolution. Vous pouvez voir dans ma réponse que sur NTFS wmicmontre une résolution à la microseconde près .
DavidPostill

Il existe une différence entre la résolution théorique et maximale, l’un indique bien la résolution maximale, l’autre indique plus d’une résolution moyenne.
Ramhound

1
@DavidPostill Si l'horloge n'incrémente l'heure que toutes les 10 ms, le fait d'avoir un fichier datetime pouvant représenter 100 ns n'a toujours qu'une précision de 10 ms. Les API UtcNow typiques (par opposition aux compteurs hautes performances conçus pour mesurer les différences de temps ) incrémentent le temps toutes les 0,5 à 16 ms sur les fenêtres, de sorte que cette réponse est assez plausible.
CodesInChaos

@CodesInChaos Oui, mais - "La meilleure ressource pour récupérer l'heure système est l'API GetSystemTimeAsFileTime. Il s'agit d'une API d'accès rapide capable de contenir des valeurs suffisamment précises (100 ns) dans ses arguments." - Je n'ai pas accès au code source Windows, je ne sais donc pas quels appels sont utilisés sous le capot lors de la manipulation des horodatages de fichiers. Nous ne savons pas quelle est la résolution réelle - il s'agit simplement de deviner.
DavidPostill
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.