2012-04-09 19 views
9

Lea esta pregunta completa y cuidadosamente antes de responder. La respuesta no es tan simple como podría parecer.¿Cómo obtengo la fecha de modificación correcta de un archivo FAT32, independientemente de la zona horaria en .NET?

Estoy escribiendo un programa que necesita realizar un seguimiento de la fecha de modificación de los archivos, algunos de los cuales se almacenan en una unidad externa FAT32. El programa se ejecuta en varias máquinas con Windows 7.

El problema es el cambio de fecha y hora UTC modificado cuando cambia el desplazamiento UTC actual. Específicamente, cuando pasamos de New Zealand Standard Time (UTC + 12) a New Zealand Daylight Time (UTC + 13) y viceversa. Eso no es un error tipográfico: UTC modificó los cambios de fecha y hora. 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.

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

El sistema timezone es Nueva Zelanda y la fecha del sistema es el 9 de abril de 2012, que es la hora estándar de Nueva Zelanda.

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

Ahora configure la fecha del sistema al 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 contrario Windows almacenará en caché el datetime modificado del archivo. Perdí mucho tiempo antes de darme cuenta de eso.

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

Ahora establezca la fecha del sistema volver al 9 de abril de 2012 y cambiar la zona horaria de Adelaida (GMT + 09: 30).

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

Entonces, ¿cómo puedo obtener la fecha de modificación correcta? Podría intentar averiguar si el archivo está en un sistema de archivos FAT32 y si es horario de verano hacer un ajuste de una hora, pero incluso si pudiera hacer que funcione, sería un hack feo horrible. ¿Usaré un sistema de bajo nivel para llamar al trabajo (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?

+0

Una solución posible para este problema podría ser no usar el LastWriteTimeUtc de un archivo, sino la diferencia de LastWriteTimeUtc de dos archivos. Si la diferencia entre "c: \ a.txt" y "c: \ b.txt" difiere de la diferencia de "\\ backup \ a.txt" y "\\ backup \ b.txt", la última fecha de última hora de al menos un archivo es diferente. – user1027167

+0

Parece que lo que realmente quiere saber es si el archivo es diferente a la última vez que lo vio. Si no son enormes, podrías molestarlos. Además, las marcas de tiempo no son realmente la solución correcta de todos modos, ya que hay condiciones de carrera allí si lee el archivo y se actualiza durante el mismo tiempo quanta. – rsaxvc

Respuesta

8

El problema es FAT32 filesystem stores file time as a local time. Por lo tanto, la hora UTC es un tiempo calculado que tiene en cuenta el horario de verano, lo que da como resultado una hora UTC diferente. En general, este problema es muy complejo, no tiene solución.

Por ejemplo, tendrá que almacenar el tiempo real de modificación del archivo UTC en un archivo separado, que debe estar sincronizado en cada máquina antes de que se elimine la unidad externa. Si la sincronización no se realiza al menos una vez, no se puede considerar correcta. Y no hay una forma simple de aplicar eso a los usuarios.

+6

OMG que apesta tanto (FAT32). Gracias por la info. – TallGuy

+2

@TallGuy: el sistema FAT32 almacena entradas de directorio en un formato que esencialmente no ha cambiado desde los días de la PC * original * de IBM.Dado que la mayoría de las microcomputadoras de la época no tenían ningún tipo de reloj preciso, e incluso la PC no tenía forma de mantener la fecha y la hora apagadas, la funcionalidad relacionada con la zona horaria no habría sido más que una molestia para la mayoría de los usuarios. – supercat

Cuestiones relacionadas