Die meisten Dateien, die ich lese, erhalten den richtigen Zeitpunkt, wenn Sie die folgende Methode zum Konvertieren verwenden:
%Vor%Hier habe ich ein Beispiel im Visual Studio, um zu zeigen, wie diese Methode manchmal nicht funktioniert. Ich zeige zum Beispiel die tatsächliche Datei auf meinem Computer und das Debugging. Also die Datei, die sich in meinem Debug befindet, ist:
"A: \ Benutzer \ Tono \ Dokumente \ Visual Studio 2010 \ Projekte \ WpfApplication4 \ WpfApplication4 \ obj \ x86 \ Debug \ App.g.cs"
Und hier ist die FILETIME, die ich in DateTime konvertieren will "Ich brauche übrigens die LastWriteTime"
Hier sehen Sie dwHighDateTime = 30136437 und auch dwLowDateTime = -2138979250 aus dieser Datei.
Und wenn ich meine Methode und andere Techniken benutze, bekomme ich folgende Daten:
Bis jetzt scheint alles gut zu funktionieren. Aber warum ist das so, wenn ich in Windows nach dieser speziellen Datei suche und suche, bekomme ich ein anderes Datum! Hier ist das Datum, das ich bekomme, wenn ich die Eigenschaften der Datei sehe:
Warum stimmen die Daten nicht überein? Was mache ich falsch?
Sie müssen die LS- und MS-Werte bitweise und nicht arithmetisch kombinieren.
Versuchen Sie:
%Vor%Oder einer der folgenden Schritte sollte ebenfalls funktionieren:
%Vor%Sie können als mit dem Hinzufügen von eher weg bitweise oder wenn Sie sicher sind, sind die Werte positiv (und haben keine Bits gemeinsam). Aber bitweise - oder drückt die Absicht besser aus.
Ich bin ein bisschen zu spät zur Party, aber das hat für mich zuverlässig funktioniert:
%Vor%Hinweis : Vertrauen Sie dem Windows Explorer nicht. Verwenden Sie die Methode File.GetLastWriteTimeUtc , Zum Beispiel, um zu überprüfen, was das Dateisystem tatsächlich hat, was diese Erweiterungsmethode zurückgibt. Der Explorer enthält einige Fehler, die die Dateizeit in bestimmten Situationen nicht aktualisieren. Prost! :)
Hinweis : Um dies zu testen, müssen Sie maximale Werte verwenden. Unter der Annahme dwHighDateTime = dwLowDateTime = UInt32.MaxValue = 4294967295 = 0xFFFFFFFF
folgt also (long)(((ulong)UInt32.MaxValue << 32) + UInt32.MaxValue) = -1 = 0xFFFFFFFFFFFFFFFF
. Leider scheint der Fehler in der Windows-API zu sein, dass irgendwann die Zeit in einen long
-Wert umgewandelt werden muss, um damit für alle nützlichen Anwendungen zu arbeiten (da die meisten Windows-API-Methoden die Dateizeit als long
nehmen) Wert), dh sobald das führende Bit auf 1
hoch ist ( dwHighDateTime
), wird der Wert negativ. Versuchen wir es mit der maximalen Zeit, die nicht hoch ist. Unter der Annahme dwHighDateTime = Int32.MaxValue = 2147483647 = 0x7FFFFFFF
und dwLowDateTime = UInt32.MaxValue = 4294967295 = 0xFFFFFFFF
folgt (long)(((ulong)Int32.MaxValue << 32) + UInt32.MaxValue) = 0x7FFFFFFFFFFFFFFF
.
Hinweis : 0x7FFFFFFFFFFFFFFF
ist bereits viel größer als DateTime.MaxValue.ToFileTimeUtc() = 2650467743999999999 = 0x24C85A5ED1C04000
, sodass Zahlen, die zu groß sind, für praktische Anwendungen in .NET bereits nutzlos sind.
Tags und Links c# datetime datetime-format filetime