kann nicht von FILETIME (windows time) in dateTime umwandeln (ich bekomme ein anderes Datum)

8

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?

    
Tono Nam 21.05.2011, 18:45
quelle

5 Antworten

15

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.

    
Joe 21.05.2011, 19:03
quelle
5

Dies ist eine andere Methode, die ich gesehen habe, um eine FileTime-Struktur in eine lange (mit einem codierten Operator in der Struktur) zu konvertieren, die dann einfach mit den DateTime.FromFileTime-Funktionen in DateTime konvertiert werden kann:

%Vor%     
mkisaacs 19.06.2012 22:32
quelle
3

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.

    
Alexandru 19.05.2015 01:08
quelle
0

Ich habe folgendes versucht und keiner von ihnen bringt mich zum richtigen Zeitpunkt:

Und ich habe die Methode von hier

    
Tono Nam 21.05.2011 19:46
quelle
0

dwLowDateTime und dwHighDateTime sollten uint sein und es sieht so aus, als wären sie int . Dies zu ändern wird höchstwahrscheinlich das Problem beheben, da @Joe darauf hinwies, dass du | anstelle von + verwenden solltest.

    
Yaur 21.05.2011 19:23
quelle