Como obtenho o datetime modificado correto de um arquivo FAT32, independentemente do fuso horário no .NET?

Por favor, leia esta perguntatotalmente e com cuidado antes de responder. A resposta não é tão simples quanto parece.

Eu estou escrevendo um programa que precisa acompanhar o datetime modificado de arquivos, alguns dos quais são armazenados em uma unidade FAT32 externa. O programa está sendo executado em várias máquinas do Windows 7.

O problema é as alterações de data e hora modificadas em UTC quando o deslocamento do UTC atual é alterado. Especificamente, quando passamos da Hora Padrão da Nova Zelândia (UTC + 12) para a Hora de Verão da Nova Zelândia (UTC + 13) e vice-versa. Isso não é um erro de digitação - oUTC alterações de data e hora modificadas. Não deveria, isso é o tipo de UTC, mas faz. Esta parece ser uma limitação do sistema de arquivos FAT32 - os arquivos no NTFS funcionam bem.

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

O fuso horário do sistema é a Nova Zelândia e a data do sistema é 9 de abril de 2012, que é o horário padrão da Nova Zelândia.

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

Agora defina a data do sistema para 1 de março de 2012, que é horário de verão da Nova Zelândia. Observe que renomei o diretório que contém o arquivo de teste. Isto é importante porque de outra formaO Windows armazenará em cache a data e hora modificadas do arquivo. Eu perdi muito tempo antes de descobrir isso.

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

Agora defina a data do sistema para 9 de abril de 2012 e altere o fuso horário para Adelaide (UTC + 09: 30).

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

Então, como posso obter o datetime modificado correto? Eu poderia tentar descobrir se o arquivo está em um sistema de arquivos FAT32 e se é horário de verão fazer um ajuste de uma hora, mas mesmo se eu pudesse fazer isso funcionar seria um hack horrível feio. Vai usar um trabalho de chamada de sistema de baixo nível (eu suspeito que não porque o problema parece estar no nível do sistema operacional)? Posso alterar o fuso horário do processo sem alterá-lo na máquina inteira? Existe alguma outra maneira?

questionAnswers(1)

yourAnswerToTheQuestion