2012-04-09 2 views
9

Внимательно прочитайте этот вопрос перед ответом. Ответ не так прост, как может показаться.Как получить правильное измененное datetime файла FAT32, независимо от часового пояса в .NET?

Я пишу программу, которая должна отслеживать модифицированное datetime файлов, некоторые из которых хранятся на внешнем диске FAT32. Программа запускается на разных машинах Windows 7.

Проблема связана с измененным временем изменения времени UTC, когда изменяется текущее смещение UTC. В частности, когда мы переходим от Новой Зеландии стандартного времени (UTC + 12) к Новозеландскому летнему времени (UTC + 13) и обратно. Это не опечатка - UTC измененный datetime changes. Это не должно быть, это своего рода точка UTC, но это так. Это, по-видимому, является ограничением файловой системы FAT32 - файлы на NTFS работают нормально.

Console.WriteLine(DateTime.Now.ToString() + (DateTime.Now.IsDaylightSavingTime() ? " Daylight" : " Standard")); 
Console.WriteLine(new FileInfo(args[0]).LastWriteTimeUtc.ToString("yyyyMMdd HH mmss")); 

Системный часовой пояс - это Новая Зеландия, а системная дата - 9 апреля 2012 года, которая является стандартом Новой Зеландии.

C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test1\Test.txt 
2012-04-09 3:53:46 pm Standard 
20120409 03 5316 

Теперь установите системную дату на 1 марта 2012 года, которая является новозеландским днем. Обратите внимание, что я переименовал каталог, содержащий тестовый файл. Это важно, потому что иначе Windows будет кэшировать измененное datetime файла. Я потратил много времени, прежде чем понял это.

C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test2\Test.txt 
2012-03-01 3:54:13 pm Daylight 
20120409 02 5316 

Теперь установить системную дату назад 9 апреля 2012 года и изменить часовой пояс в Аделаиду ​​(UTC + 09: 30).

C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test3\Test.txt 
2012-04-09 1:27:21 pm Standard 
20120409 06 2316 

Так как я могу получить правильное измененное datetime? Я мог бы попытаться выяснить, находится ли файл в файловой системе FAT32, и если это переход на летнее время, сделайте настройку на один час, но даже если бы я мог это сделать, это было бы ужасным уродливым взломом. Будет ли использовать работу системного вызова низкого уровня (я подозреваю, что проблема не в том, что проблема на уровне ОС)? Могу ли я изменить часовой пояс процесса, не меняя его на всей машине? Есть ли другой путь?

+0

Возможным обходным решением этой проблемы может быть не использование LastWriteTimeUtc одного файла, а различие в файле LastWriteTimeUtc из двух файлов. Если разность «c: \ a.txt» и «c: \ b.txt» отличается от разности «\\ backup \ a.txt» и «\\ backup \ b.txt», LastWriteTimeUtc в по меньшей мере один файл отличается. – user1027167

+0

Кажется, что вы действительно хотите знать, если файл отличается от последнего, когда вы его видели. Если они не огромны, вы можете их уничтожить. Кроме того, временные метки на самом деле не являются правильным решением, так как там есть условия гонки, если вы читаете файл и обновляетесь за одни и те же кванты времени. – rsaxvc

ответ

8

проблема есть, FAT32 filesystem stores file time as a local time. Таким образом, время UTC представляет собой расчетное время, которое учитывает DST, что приводит к разному времени UTC. В общем, эта проблема настолько сложна, что она неразрешима.

Например, вам необходимо сохранить реальное время изменения файла UTC в отдельном файле, который должен быть синхронизирован на каждой машине до удаления внешнего диска. Если синхронизация не будет предварительно сформирована хотя бы один раз, это не может считаться правильным. И нет простого способа обеспечить это для пользователей.

+6

OMG, что отстой так много (FAT32). Спасибо за информацию. – TallGuy

+2

@TallGuy: система FAT32 хранит записи каталога в формате, который практически не изменяется со времен * оригинального * IBM PC.Учитывая, что у большинства микрокомпьютеров той эпохи не было никаких точных часов, и даже у ПК не было никакого способа поддерживать дату и время при выключенном питании, функциональность, связанная с часовым поясом, была бы всего лишь помехой для большинство пользователей. – supercat

Смежные вопросы