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?
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
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