2012-04-09 5 views
9

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?

+0

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

+0

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

Antwort

8

Das Problem ist, FAT32 filesystem stores file time as a local time. Somit ist die UTC-Zeit eine berechnete Zeit, die DST berücksichtigt, was zu einer anderen UTC-Zeit führt. Im Allgemeinen ist dieses Problem so komplex, dass es unlösbar ist.

Zum Beispiel müssen Sie die tatsächliche Zeit für die Änderung der UTC-Datei in einer separaten Datei speichern, die auf jeder Maschine synchronisiert werden muss, bevor das externe Laufwerk entfernt wird. Wenn die Synchronisierung nicht mindestens einmal durchgeführt wird, kann sie nicht als korrekt angesehen werden. Und es gibt keine einfache Möglichkeit, dies für Benutzer durchzusetzen.

+6

OMG, die so viel saugt (FAT32). Danke für die Information. – TallGuy

+2

@TallGuy: Das FAT32-System speichert Verzeichniseinträge in einem Format, das seit den Tagen des * ursprünglichen * IBM PC im Wesentlichen unverändert geblieben ist.Angesichts der Tatsache, dass die meisten Mikrocomputer der Ära keine genaue Uhr hatten und selbst der PC keine Möglichkeit hatte, Datum und Uhrzeit im ausgeschalteten Zustand zu halten, wäre die zeitzonenbezogene Funktionalität nichts als ein Ärgernis für sie gewesen die meisten Benutzer. – supercat