Bitte lesen Sie diese Frage vollständig und sorgfältig vor der Beantwortung. Die Antwort ist nicht so einfach wie es scheint.Wie bekomme ich die korrekte modifizierte Datetime einer FAT32-Datei, unabhängig von der Zeitzone in .NET?
Ich schreibe ein Programm, das die geänderte Datetime von Dateien verfolgen muss, von denen einige auf einem externen FAT32-Laufwerk gespeichert sind. Das Programm wird auf verschiedenen Windows 7-Computern ausgeführt.
Das Problem ist die geänderte UTC-Datetime-Änderung, wenn sich der aktuelle UTC-Offset ändert. Insbesondere, wenn wir von der neuseeländischen Standardzeit (UTC + 12) zur neuseeländischen Sommerzeit (UTC + 13) und wieder zurück gehen. Das ist kein Tippfehler - die UTC geänderten Datetime-Änderungen. Es sollte nicht, das ist der Punkt von UTC, aber es tut. Dies scheint eine Einschränkung des FAT32-Dateisystems zu sein - Dateien auf NTFS funktionieren einwandfrei.
Systemzeitzone ist Neuseeland und das Systemdatum ist 9. April 2012, die Neuseeland-Standardzeit ist.
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test1\Test.txt
2012-04-09 3:53:46 pm Standard
20120409 03 5316
Legen Sie jetzt das Systemdatum auf 1. März 2012 fest, die Neuseeland Daylight Time ist. Beachten Sie, dass ich das Verzeichnis umbenannt habe, das die Testdatei enthält. Dies ist wichtig, da Windows das geänderte Datum der Datei sonst zwischenspeichert. Ich habe viel Zeit verschwendet, bevor ich das herausgefunden habe.
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test2\Test.txt
2012-03-01 3:54:13 pm Daylight
20120409 02 5316
nun das Systemdatum zurück bis 9. April 2012 sowie die Zeitzone nach Adelaide (UTC + 09: 30) ändern.
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test3\Test.txt
2012-04-09 1:27:21 pm Standard
20120409 06 2316
Also wie kann ich die richtige modifizierte Datetime bekommen? Ich könnte versuchen, herauszufinden, ob die Datei auf einem FAT32-Dateisystem ist, und wenn es Sommerzeit ist, machen Sie eine einstündige Anpassung, aber selbst wenn ich das zur Arbeit bringen könnte, wäre es ein schrecklicher hässlicher Hack. Wird die Verwendung eines Low-Level-Systemaufrufs funktionieren (ich vermute nicht, weil das Problem auf Betriebssystemebene zu sein scheint)? Kann ich die Zeitzone des Prozesses ändern, ohne sie auf der ganzen Maschine zu ändern? Gibt es einen anderen Weg?
Eine mögliche Abhilfe für dieses Problem möglicherweise nicht die LastWriteTimeUtc einer Datei, sondern der Unterschied der LastWriteTimeUtc von zwei Dateien verwenden. Wenn der Unterschied zwischen "c: \ a.txt" und "c: \ b.txt" von dem Unterschied von "\\ backup \ a.txt" und "\\ backup \ b.txt" abweicht, ist die LastWriteTimeUtc von at mindestens eine Datei ist anders. – user1027167
Es scheint so, als ob Sie wirklich wissen wollen, ob sich die Datei von der letzten Anzeige unterscheidet. Wenn sie nicht riesig sind, könntest du sie hacken. Außerdem sind Timestamps sowieso nicht die richtige Lösung, da es dort Race-Conditions gibt, wenn man die Datei liest und sie gleichzeitig in der gleichen Zeit aktualisiert wird. – rsaxvc