Uzyskaj czas utworzenia pliku w milisekundach

13

Czy istnieje sposób na uzyskanie czasu tworzenia pliku w systemie Windows z większą dokładnością? Chcę uzyskać czas tworzenia wideo MP4 w milisekundach. czy to możliwe?

Phil
źródło
Muszę zapytać, dlaczego potrzebujesz tej dokładności?
Moab
1
Nagrywam niektóre dane z czujników na urządzeniu z Androidem wraz z filmem. Sam zapisałem rejestrowanie czujnika i rejestruję czas systemowy wraz z każdą wartością czujnika. Do nagrywania wideo używam standardowej aktywności kamery. Po przesłaniu danych do komputera chcę je przeanalizować. Aby scalić wideo z danymi czujnika, muszę wiedzieć, kiedy wideo się zaczęło. Sekundy są trochę zbyt gruboziarniste, więc szukam sposobu, aby uzyskać dokładniejszy czas rozpoczęcia filmu.
Phil
3
Uwaga: jeśli potrzebujesz tego rodzaju relacji między dwoma strumieniami danych, zwykle konieczne jest umieszczenie sygnału rejestracyjnego w strumieniu (podobnie jak stare klapy używane w filmach, jak reżyser nazywa „akcję”. Klask był wizualną wskazówką i dźwiękiem cue, umożliwiając później synchronizację dwóch lub więcej strumieni). W niektórych sytuacjach opóźnienie między utworzeniem pliku w trybie jądra (a zarejestrowaniem znacznika czasu) a przebudzeniem procesu w celu poinformowania go, że ma on uchwyt pliku, może w rzeczywistości być wyższe niż tolerancje dla danych.
Cort Ammon
Kiedy kopiujesz swoje pliki z Androida do innego miejsca, upewnij się, że wszystkie narzędzia do kopiowania zachowują precyzję znaczników czasu. Zauważ, że wiele narzędzi do kopiowania sprawi, ctimeże kopia będzie czasem, kiedy została skopiowana.
Peter Cordes,
1
W systemie Windows użyłbym cygwin / mingw, stataby uzyskać wszystkie 3 znaczniki czasu. Oczywiście dlatego, że zwykle używam GNU / Linux.
Peter Cordes,

Odpowiedzi:

22

Rozdzielczość znacznika czasu

Sygnatura czasowa utworzenia pliku w systemie Windows zależy od systemu plików:

  • FAT / VFAT ma maksymalną rozdzielczość 2 s

  • NTFS ma maksymalną rozdzielczość 100 ns


rozwiązanie WMIC

Możesz użyć, wmicaby pobrać datę utworzenia pliku z dokładnością do mikrosekundy.

Przykład:

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

Data utworzenia 20150329221650.080654+060jest datownikiem o następującym formacie:

yyyymmddHHMMSS.xxxxxxsUUU

gdzie:

  • yyyy Czterocyfrowy rok (od 0000 do 9999).

  • mm Dwucyfrowy miesiąc (od 01 do 12).

  • dd Dwucyfrowy dzień miesiąca (od 01 do 31).

  • HH Dwucyfrowa godzina za pomocą 24-godzinnego zegara (od 00 do 23).

  • MM Dwucyfrowa minuta na godzinę (od 00 do 59).

  • SS Dwucyfrowa liczba sekund na minutę (od 00 do 59).

  • xxxxxx Sześciocyfrowa liczba mikrosekund w drugiej (od 000000 do 999999)

  • sZnak plus ( +) lub znak minus ( -) oznacza dodatnie lub ujemne przesunięcie względem uniwersalnych czasów koordynowanych (UTC).

  • UUU Trzycyfrowe przesunięcie wskazujące liczbę minut, które początkowa strefa czasowa odbiega od UTC.


rozwiązanie stat

Możesz także użyć stat(z instalacji cygwin lub mingw ).

Przykład:

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

wyjście reż dla porównania

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

Dalsza lektura

DavidPostill
źródło
@NateEldredge Dzięki, dobrze zauważony. Odpowiedź poprawiona.
DavidPostill
4
Uwaga: tylko dlatego, że znaczniki czasu zawierają cyfrę wysokiej częstotliwości, taką jak cyfra 100 nanosekund, nie oznacza, że ​​zegar może być używany jako niezawodne źródło czasu w zakresie 100ns. Stwierdza jedynie, że istnieje wiele fragmentów treści, które są (mam nadzieję) monotoniczne i w przybliżeniu korelują z czasem „rzeczywistym”.
Cort Ammon
1
Patrz msdn CIM_DATETIME : w Twojej notacji xxxxxxjest sześciocyfrowa liczba mikrosekund w drugiej (od 000000 do 999999) . Micro- , tj 10^-6. Oczywiście pierwszy triplet reprezentuje mili- ( 10^-3): obcięty, nie zaokrąglony. Drugi wyodrębniony triplet sam w sobie nie reprezentuje niczego ... Jednak niektóre wmiwartości daty 000i wmic OS get LocalDateTime
godziny
1
Dzięki, tego rodzaju odpowiedzi sprawiają, że uwielbiam wymianę stosów :)
Phil
1
@MarisB. Ach Odpowiedź zaktualizowana.
DavidPostill
1

Sprytny sposób pokazano tutaj: https://stackoverflow.com/questions/5180592/showing-ntfs-timestamp-w100-nsec-granularity

Używa VBScript do przeszukiwania bazy danych CMI WMI i zwrócenia FILETIMEstruktury powiązanej z plikiem.

Istnieją również narzędzia typu open source, które mogą sprawdzać metadane pliku multimedialnego, takie jak EXIFtool, którego celem jest zarządzanie metadanymi multimediów tworzonymi przez aparaty cyfrowe.

Stavr00
źródło
1

Znalazłem sposób na uzyskanie tego w Matlabie:

Możesz użyć funkcji GetFileTime napisanej przez Jana Simona. Jeśli nie chcesz kompilować własnych plików mex, możesz również pobrać skompilowane pliki tutaj .

Nie jest tak dokładny jak używanie wmic (tylko ms), ale dla mojego celu jest odpowiedni.

Phil
źródło
-3

To zależy od systemu plików : FAT ma rozdzielczość 2 sekundy, NTFS teoretycznie ma rozdzielczość 100 ns, ale rzeczywista rozdzielczość wynosi 10 ms . To powiedziawszy, przerwania mają wyższy priorytet niż dyskowe operacje we / wy i nie jestem pewien, czy buforowanie zapisu ma wpływ na znacznik czasu. Zegary multimedialne są zoptymalizowane pod kątem dokładności, więc byłby preferowanym sposobem realizacji synchronizacji.

Możesz użyć istniejącego narzędzia, takiego jak XYplorer, aby wyświetlić znaczniki czasu w wysokiej rozdzielczości lub XYplorer pokazuje msmożesz napisać własną aplikację. Użyj metody File.GetCreationTime ; zwraca strukturę DateTime z właściwością Millisecond .

DrMoishe Pippik
źródło
1
um ... nie bądź niegrzeczny, ale czy przeczytałeś odpowiedź @ DavidPostill?
td512,
2
„Teoretycznie NTFS ma rozdzielczość 100 ns, ale rzeczywista rozdzielczość to 10 ms ” jest niepoprawny - ten link faktycznie mówi „ na NT FAT czas tworzenia ma rozdzielczość 10 milisekund”. To nie znaczy , że NTFS ma tę rozdzielczość. Z mojej odpowiedzi widać, że na NTFS wmicpokazuje rozdzielczość z dokładnością do najbliższej mikrosekundy .
DavidPostill
Istnieje różnica między teoretyczną a maksymalną rozdzielczością, jedna dobrze wskazuje maksymalną rozdzielczość, druga wskazuje bardziej na średnią rozdzielczość.
Ramhound,
1
@DavidPostill Jeśli zegar zwiększa czas tylko co 10 ms, wówczas zapisanie daty i godziny, która może reprezentować 100ns, nadal ma dokładność tylko 10ms. Typowe interfejsy API UtcNow (w przeciwieństwie do liczników o wysokiej wydajności, które są przeznaczone do pomiaru różnic czasu ) zwiększają czas co 0,5-16 ms w oknach, więc ta odpowiedź jest całkiem wiarygodna.
CodesInChaos
@CodesInChaos Tak, ale - „Najlepszym zasobem do pobierania czasu systemowego jest interfejs API GetSystemTimeAsFileTime. Jest to interfejs API szybkiego dostępu, który może przechowywać wystarczająco dokładne wartości (100 jednostek ns) w swoich argumentach.” - Nie mam dostępu do kodu źródłowego systemu Windows, więc nie wiem, jakie połączenia są używane pod maską podczas manipulowania znacznikami czasu plików. Nie wiemy, jaka jest rzeczywista rozdzielczość - to tylko zgadywanie.
DavidPostill