Получить время создания файла в миллисекундах


13

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


Я должен спросить, зачем вам эта точность?
Моав

1
Я записываю некоторые данные датчика на устройстве Android вместе с видео. Я написал журнал датчиков самостоятельно и записал системное время вместе с каждым значением датчика. Для записи видео я использую стандартную активность камеры. После отправки данных на ПК я хочу проанализировать их. Чтобы объединить видео с данными датчика, я должен знать, когда видео началось. Секунды немного грубоваты, поэтому я ищу способ получить более точное время начала видео.
Фил

3
Примечание: если вам нужна такая связь между двумя потоками данных, обычно необходимо поместить сигнал регистрации в поток (например, старые вагонки, используемые в фильмах, когда режиссер называет «действие». Хлопок был визуальным сигналом и звуком. cue, позволяя синхронизировать два или более потоков позже). В некоторых ситуациях временная задержка между созданием файла в режиме ядра (и записью временной метки) и пробуждением вашего процесса, чтобы он знал, что у него есть дескриптор файла, может фактически превышать допустимые отклонения для ваших данных.
Корт Аммон

Когда вы копируете свои материалы из Android в другое место, убедитесь, что все инструменты копирования сохраняют точность отметки времени. Обратите внимание, что многие инструменты копирования сделают ctimeкопию моментом ее копирования.
Питер Кордес

1
В Windows я бы использовал cygwin / mingw, statчтобы получить все 3 метки времени. Конечно, это потому, что я обычно использую GNU / Linux.
Питер Кордес

Ответы:


23

Разрешение отметки времени

Метка времени создания файла в Windows зависит от файловой системы:

  • FAT / VFAT имеет максимальное разрешение 2 с

  • NTFS имеет максимальное разрешение 100 нс


wmic решение

Вы можете использовать, wmicчтобы получить дату создания файла с точностью до микросекунды.

Пример:

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

Дата создания 20150329221650.080654+060- это временная метка в следующем формате:

yyyymmddHHMMSS.xxxxxxsUUU

где:

  • yyyy Четырехзначный год (от 0000 до 9999).

  • mm Двузначный месяц (с 01 по 12).

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

  • HH Двузначные часы дня с использованием 24-часовых часов (с 00 по 23).

  • MM Двухзначная минута в часе (от 00 до 59).

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

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

  • sЗнак плюс ( +) или знак минус ( -) указывает положительное или отрицательное смещение относительно всемирного координированного времени (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 Спасибо, хорошо заметили. Ответ исправлен.
ДэвидПостилл

4
Предупреждение: только потому, что временные метки содержат высокочастотную цифру, такую ​​как цифра 100 наносекунд, не означает, что часы можно использовать в качестве надежного источника времени в диапазоне 100 нс. Это просто говорит о том, что есть много битов контента, который [надеюсь] монотонен и примерно соответствует «реальному» времени.
Корт Аммон

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

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 с миллисекундным свойством.


1
хм ... не хамить, но ты прочитал ответ @ DavidPostill?
td512

2
«Теоретически NTFS имеет разрешение 100 нс, но фактическое разрешение составляет 10 мс », это неверно - эта ссылка фактически говорит: «В NT FAT время создания имеет разрешение 10 миллисекунд». Это не означает, что NTFS имеет такое разрешение. Из моего ответа wmicвидно, что в NTFS отображается разрешение с точностью до микросекунды .
ДэвидПостилл

Существует разница между теоретическим и максимальным разрешением, одно указывает на максимальное разрешение, другое указывает на большее среднее разрешение.
Ramhound

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

@CodesInChaos Да, но - «Лучший ресурс для извлечения системного времени - это API-интерфейс GetSystemTimeAsFileTime. Это API-интерфейс быстрого доступа, который может содержать достаточно точные (100 нс единиц) значения в своих аргументах». - У меня нет доступа к исходному коду Windows, поэтому я не знаю, какие вызовы используются скрытно при манипулировании временными метками файлов. Мы не знаем, каково реальное разрешение - это просто предположение.
Дэвид Постилл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.