Member 13566383 Ответов: 3

Lastwritetimeutc разница в 2 копиях файла


У меня есть pdf-файл на жестком диске, из которого я создал копию на флешке.
Затем я попытался сравнить свойства файлов обеих версий, используя следующий код:

DirectoryInfo hardDisk = new DirectoryInfo(hardDisk);
FileInfo[] hardDiskFiles = hardDisk.GetFiles();

DirectoryInfo usb = new DirectoryInfo(usbStick);
FileInfo[] usbFiles = usb.GetFiles();


Что я уже пробовал:

Отладчик говорит мне (проверяя hardDiskFiles / usbFiles) что LastWriteTimeUtc
из файла жесткого диска это
03.06.2017 08:50:56
в то время как то же самое свойство для файла usb показывает
03.06.2017 08:50:58
Таким образом, существует разница во времени в две секунды для даты почти два года назад. Как это можно объяснить?

3 Ответов

Рейтинг:
23

Richard Deeming

Наиболее вероятная причина заключается в том, что ваш жесткий диск отформатирован с помощью NTFS, в то время как ваш USB-накопитель отформатирован с помощью FAT.

Статья в МСКБ[^] кажется, больше не существует, но согласно этот ответ StackOverflow[^]:

Цитата:
Метки времени файла на дисках FAT округляются до ближайших двух секунд (четное число), когда файл записывается на диск. Метки времени файла на дисках NTFS округляются до ближайших 100 наносекунд, когда файл записывается на диск. Следовательно, временные метки файлов на дисках FAT всегда заканчиваются четным числом секунд, в то время как временные метки файлов на дисках NTFS могут заканчиваться четным или нечетным числом секунд.

Когда файлы копируются с дисков NTFS на диски FAT, должно происходить некоторое округление метки времени файла; метка времени файла округляется до следующей четной секунды.


Maciej Los

5ed!

Рейтинг:
1

Gerry Schmitz

Зависит от утилиты копирования.

Даты можно хранить в "галочках".

Как были скопированы даты? Было ли это двоичное число до "даты", затем дата до двоичного числа, а затем ...

Каковы были / есть цели и источники, их форматы и точность?

Округление от миллисекунд до секунд; вверх или вниз? Усечь?


Member 13566383

Я скопировал файл (вручную) с помощью Проводника windows (copy and paste), то есть не было никакого собственного программного обеспечения.
Только после копирования файла я запустил свое собственное программное обеспечение, чтобы проверить наличие различий свойств в обоих файлах.

Рейтинг:
0

Member 13566383

Не совсем решение, но, возможно, что-то вроде объяснения:
Я действительно вижу точно такое же поведение, если копирую свой файл с помощью File.Copy в моем коде.
Считывание времени в исходном файле с помощью File.GetLastWriteTimeUtc показывает вышеупомянутую дату и время 03.06.2017 08:50:56, что соответствует внутренним тикам 636320766565495201.
Отметка времени целевого файла-03.06.2017 08:50:56, что соответствует 636320766580000000 внутренних тиков.
Очевидно, что количество тиков округляется при записи их в целевой файл.
Я попытался явно скопировать исходное время в целевое с помощью

File.SetLastWriteTimeUtc("<targetPath>", File.GetLastWriteTimeUtc("sourcePath"));

Безрезультатно: количество тиков округляется в целевом объекте.
Перезапись количества тиков невозможна, так как соответствующее свойство доступно только для чтения.
Теперь я более или менее понимаю, что происходит. Чего я не понимаю, так это почему это делается именно так.