9

Вопрос по timezone, .net, c# – Как получить правильный измененный datetime файла FAT32, независимо от часового пояса в .NET?

Пожалуйста, прочитайте этот вопросfully and carefully прежде чем ответить. Ответ не так прост, как может показаться.

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

Проблема заключается в изменении даты и времени в формате UTC при изменении текущего смещения UTC. В частности, когда мы переходим из стандартного времени Новой Зеландии (UTC + 12) в летнее время Новой Зеландии (UTC + 13) и обратно. Это не опечатка -UTC изменено изменение даты и времени. Это не должно быть, это как бы точка 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 will cache the modified 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

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

  • Error: User Rate Limit ExceededoriginalError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

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

    от rsaxvc
  • Одним из возможных путей решения этой проблемы может быть не использование LastWriteTimeUtc одного файла, а разница LastWriteTimeUtc двух файлов. Если разница "c: \ a.txt" и & quot; c: \ b.txt & quot; отличается от разницы в \\ backup \ a.txt & quot; и & quot; \\ backup \ b.txt & quot ;, LastWriteTimeUtc хотя бы одного файла отличается.

    от user1027167
  • 8

    Проблема в,

    Файловая система FAT32 хранит время файла как местное время, Таким образом, время UTC - это расчетное время, которое учитывает DST, что приводит к другому времени UTC. В общем, эта проблема настолько сложна, что она неразрешима.

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