Wie erhalte ich die korrekte geänderte Datums- und Uhrzeiteinstellung einer FAT32-Datei, unabhängig von der Zeitzone in .NET?

Bitte lesen Sie diese Fragevollständig und sorgfältig bevor Sie antworten. Die Antwort ist nicht so einfach, wie es scheint.

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, dass sich die UTC-Zeit ändert, wenn sich der aktuelle UTC-Offset ändert. Insbesondere, wenn wir von der neuseeländischen Standardzeit (UTC + 12) zur neuseeländischen Sommerzeit (UTC + 13) und zurück fahren. Das ist kein Tippfehler - derkoordinierte Weltzeit geänderte datetime Änderungen. Es sollte nicht, das ist eine Art von UTC-Punkt, aber das tut es. Dies scheint eine Einschränkung des FAT32-Dateisystems zu sein - Dateien unter NTFS funktionieren einwandfrei.

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

Die Zeitzone des Systems ist Neuseeland. Das Systemdatum ist der 9. April 2012 (New Zealand Standard Time).

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

Stellen Sie nun das Systemdatum auf den 1. März 2012 ein, also die neuseeländische Sommerzeit. Beachten Sie, dass ich das Verzeichnis umbenannt habe, das die Testdatei enthält. Das ist wichtig, weil sonstWindows speichert die geänderte Datums- und Uhrzeitangabe im Cache der Datei. Ich habe viel Zeit verschwendet, bevor ich das herausgefunden habe.

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

Stellen Sie nun das Systemdatum auf den 9. April 2012 zurück und ändern Sie die Zeitzone in 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>

Wie kann ich also die korrekte modifizierte Datums- und Uhrzeitangabe ermitteln? Ich könnte versuchen herauszufinden, ob sich die Datei auf einem FAT32-Dateisystem befindet und ob es Sommerzeit ist. Nehmen Sie eine einstündige Anpassung vor, aber selbst wenn ich das zum Laufen bringen könnte, wäre es ein schrecklicher hässlicher Hack. Funktioniert die Verwendung eines Systemaufrufs auf niedriger Ebene (ich vermute nicht, dass das Problem auf Betriebssystemebene zu liegen scheint)? Kann ich die Zeitzone des Prozesses ändern, ohne sie auf der gesamten Maschine zu ändern? Gibt es einen anderen Weg?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage