¿Cómo obtengo la fecha y hora de modificación correcta de un archivo FAT32, independientemente de la zona horaria en .NET?

Por favor lea esta preguntacompletamente y con cuidado antes de contestar La respuesta no es tan simple como podría parecer.

Estoy escribiendo un programa que necesita realizar un seguimiento de la fecha y hora modificada de los archivos, algunos de los cuales se almacenan en una unidad externa FAT32. El programa se está ejecutando en varias máquinas con Windows 7.

El problema es que los cambios de fecha y hora modificados por UTC cuando cambia el desplazamiento UTC actual. Específicamente, cuando pasamos de la Hora estándar de Nueva Zelanda (UTC + 12) a la Hora de verano de Nueva Zelanda (UTC + 13) y de regreso. Eso no es un error tipográfico - elUTC cambios de fecha y hora modificados. No debería, ese es el punto de UTC, pero lo hace. Esto parece ser una limitación del sistema de archivos FAT32: los archivos en NTFS funcionan bien.

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

La zona horaria del sistema es Nueva Zelanda y la fecha del sistema es el 9 de abril de 2012, que es la Hora estándar de Nueva Zelanda.

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

Ahora configure la fecha del sistema para el 1 de marzo de 2012, que es el horario de verano de Nueva Zelanda. Tenga en cuenta que he cambiado el nombre del directorio que contiene el archivo de prueba. Esto es importante porque de lo contrarioWindows almacenará en caché la fecha y hora modificada del archivo. Perdí mucho tiempo antes de darme cuenta de eso.

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

Ahora configure la fecha del sistema de nuevo al 9 de abril de 2012 y cambie la zona horaria a 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>

Entonces, ¿cómo puedo obtener el datetime modificado correcto? Podría intentar averiguar si el archivo está en un sistema de archivos FAT32 y si es el horario de verano hacer un ajuste de una hora, pero incluso si pudiera hacer que eso funcionara, sería un horrible truco feo. ¿Funcionará el uso de una llamada al sistema de bajo nivel (sospecho que no porque el problema parece estar en el nivel del sistema operativo)? ¿Puedo cambiar la zona horaria del proceso, sin cambiarlo en toda la máquina? ¿Hay alguna otra manera?

Respuestas a la pregunta(1)

Su respuesta a la pregunta