Отримайте час створення файлу в мілісекундах


13

Чи є спосіб отримати час створення файлу у Windows з більшою точністю? Я хочу отримати час створення mp4-відео в мілісекундах. Чи можливо це?


Я повинен запитати, навіщо вам потрібна ця точність?
Моаб

1
Я записую деякі дані сенсорів на пристрої Android разом із відео. Я записав реєстрацію датчиків самостійно і записував системний час разом із кожним значенням датчика. Для запису відео я використовую стандартну активність камери. Після відправлення даних на ПК я хочу їх проаналізувати. Для злиття відео з даними датчика я повинен знати, коли відео почалося. Секунди трохи грубі, тому я шукаю спосіб отримати більш точний час початку відео.
Філ

3
Примітка: якщо вам потрібні такі відносини між двома потоками даних, зазвичай важливо покласти сигнал реєстрації в потік (як, наприклад, старі вагонні дошки, які використовуються у фільмах як режисер називає "дія". Хлоп був візуальним сигналом і звуком кий, що дозволяє два або більше потоків синхронізувати пізніше). У деяких ситуаціях часова затримка між створенням файлу в режимі ядра (та записом часової позначки) та пробудженням вашого процесу, щоб дати йому знати, що має використовувати ручку файлу, насправді може бути вищою за допустимі допуски до ваших даних.
Корт Аммон

Коли ви копіюєте свої речі з Android де-небудь ще, переконайтеся, що всі інструменти для копіювання зберігають точність міток часу. Зауважте, що багато інструментів копіювання перетворять ctimeкопію на час її копіювання.
Пітер Кордес

1
У Windows я використовую cygwin / mingw, statщоб отримати всі 3 позначки. Звичайно, це тому, що я зазвичай використовую GNU / Linux.
Пітер Кордес

Відповіді:


23

Дозвіл часу

Часові позначення часу створення файлу у Windows залежать від файлової системи:

  • FAT / VFAT має максимальну роздільну здатність 2s

  • NTFS має максимальну роздільну здатність 100 нс


wmic розчин

Ви можете використовувати wmicдля отримання дати створення файлу до найближчої мікросекунди.

Приклад:

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

CreationDate 20150329221650.080654+060є відміткою про часу, в наступному форматі:

yyyymmddHHMMSS.xxxxxxsUUU

де:

  • yyyy Чотиризначний рік (0000 - 9999).

  • mm Двозначний місяць (з 01 по 12).

  • dd Двозначний день місяця (з 01 по 31).

  • HH Двозначна година дня за допомогою цілодобового годинника (00 - 23).

  • MM Двозначна хвилина за годину (з 00 по 59).

  • SS Двозначне число секунд у хвилині (00 - 59).

  • xxxxxx Шестизначне число мікросекунд у секунді (000000 по 999999)

  • sЗнак плюс ( +) або знак мінус ( -) для позначення позитивного чи негативного зміщення від координованого Universal Times (UTC).

  • UUU Тризначне зміщення, яке вказує на кількість хвилин, за якими часовий пояс походження відхиляється від UTC.


статичний розчин

Ви також можете використовувати stat(з установки cygwin або mingw ).

Приклад:

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

dir вихід для порівняння

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

Подальше читання


@NateEldredge Спасибі, добре помічений. Відповідь виправлена.
DavidPostill

4
Зауваження: лише тому, що часові позначки містять цифру високої частоти, таку як цифра 100 наносекунд, не означає, що годинник може використовуватися як надійне джерело часу в діапазоні 100ns. Це просто зазначає, що є багато бітів вмісту, які [сподіваємось] монотонні і приблизно співвідносяться з "реальним" часом.
Корт Аммон

1
Див. Msdn CIM_DATETIME : у вашій нотації xxxxxx- шість цифр число мікросекунд у секунду (000000 - 999999) . Мікро- , тобто 10^-6. Звичайно, перша трійка являє собою мілі- ( 10^-3): усічений, а не округлий. Витягнутий другий тріплет не представляє собою нічого ... Однак деякі wmiзначення 000wmic OS get LocalDateTime
дат часу

1
Дякую, такі відповіді, чому я люблю обмін стеками :)
Філ

1
@MarisB. Ага. Відповідь оновлено.
DavidPostill

1

Тут продемонстровано розумний шлях: /programming/5180592/showing-ntfs-timestamp-with-100-nsec-granularity

Він використовує VBScript для запиту бази даних CIM WMI і повернення FILETIMEструктури, пов'язаної з файлом.

Також є інструменти з відкритим кодом, які можуть перевіряти метадані медіа-файлів, наприклад EXIFtool, який спрямований на управління метаданими медіа-файлів, створених цифровими камерами.


1

Я знайшов спосіб отримати це в Matlab:

Ви можете використовувати GetFileTime, яку написав Ян Саймон. Якщо ви не хочете компілювати свої власні файли MEX, ви також можете завантажити скомпільовані файли тут .

Це не так точно, як використання wmic (лише мс), але для моєї мети воно підходить.


-3

Це залежить від файлової системи : FAT має 2 секундної роздільної здатності, NTFS теоретично має роздільну здатність 100 нс, але фактична роздільна здатність - 10 мс . Це означає, що переривання мають більший пріоритет, ніж дискові введення / виведення, і я не впевнений, що кешування запису має на часову марку.Мультимедійні таймери оптимізовані для точності, тому було б кращим способом реалізації таймінгу.

Ви можете використовувати існуючий інструмент, такий як XYplorer, для перегляду часових позначок високої роздільної здатності, або XYplorer показує мс, можливо, ви бажаєте написати власну заяву. Використовуйте метод File.GetCreationTime ; він повертає структуру DateTime з властивістю Millisecond .


1
гм ... не бути грубим, але ви читали відповідь @ DavidPostill?
td512

2
"NTFS теоретично має роздільну здатність 100 нс, але фактична роздільна здатність 10 мс " невірна - це посилання насправді говорить " на NT FAT , час створення має роздільну здатність 10 мілісекунд". Це не означає, що NTFS має таку роздільну здатність. З моєї відповіді wmicвидно, що на NTFS показана роздільна здатність до найближчої мікросекунди .
DavidPostill

Існує різниця між теоретичною та максимальною роздільною здатністю, одна вказує максимальну роздільну здатність, а інша - більше середньої роздільної здатності.
Рамхаунд

1
@DavidPostill Якщо годинник збільшує час кожні 10 мс, то подача часу на дату, яка може представляти 100ns, має точність лише 10 мс. Типові API UtcNow (на відміну від лічильників високої продуктивності, які призначені для вимірювання різниці у часі ) збільшують час на кожні 0,5-16 мс у вікнах, тому ця відповідь цілком правдоподібна.
CodesInChaos

@CodesInChaos Так, але - "Найкращим ресурсом для отримання системного часу є API GetSystemTimeAsFileTime. Це API швидкого доступу, який здатний вмістити в своїх аргументах досить точні (100 нс одиниці) значення." - У мене немає доступу до вихідного коду Windows, тому я не знаю, які дзвінки використовуються під кришкою під час обробки часових міток файлів. Ми не знаємо, що таке фактична роздільна здатність - це лише здогадки.
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.