2012-04-03 4 views
6

Ich habe ein Tool geschrieben, um Protokolldateien innerhalb eines vom Benutzer des Tools angegebenen Zeitfensters zu sammeln. Bisher habe ich die Sammlung von Protokolldateien mithilfe der File.GetLastWriteTime-Methode auf die Protokolldateien gestützt und diese anhand der Ergebnisse dieser Vergleiche mit den Zeiten verglichen, die der Benutzer eingegeben und gesammelt hat. Hier ist ein kleiner Code-Schnipsel:File.GetLastWriteTime scheint "veraltet" -Wert zu liefern

DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile); 

Allerdings bemerkte ich mein Werkzeug didnt einige Log-Dateien sammeln Ich dachte, es hätte tun sollen. Es scheint, dass die von dieser Methode zurückgegebene DateTime veraltet war (es gab eine neuere Protokollierung der Datei als der Wert dieser DateTime).

Als ich das 'Änderungsdatum' der fraglichen Datei anschaute, war es ebenfalls 'veraltet', es gab eine neuere Protokollierung der Datei als das 'Änderungsdatum'.

Wie kann ich einen genauen 'GetLastWriteTime' oder Date Modified Wert erhalten?

+0

Was meinst du mit * DateTime zurückgegeben von dieser Methode war veraltet *? – V4Vendetta

+1

Datum wird nach einer Weile nicht aktualisiert? Wenn Sie beispielsweise sehen, dass das geänderte Datum nicht mehr aktuell ist, warten Sie ca. 30 Sekunden und überprüfen Sie dann das Datum erneut. – Reniuz

+1

Lesen Sie auch diesen Artikel: http://blogs.technet.com/b/asiasupp/archive/2010/12/14/file-date-modified-property-are-not-updating-while-modifying-a-file- ohne-closing-it.aspx könnte sein, dass Sie die gleichen – Reniuz

Antwort

9

Während meiner Erfahrung ging ich ein paar Probleme wie Ihre werfen. Auf Windows Vista/7-Systemen liefert diese Funktion nicht immer ein zuverlässiges Ergebnis.

Nach einer Weile fanden wir diesen Link: Disabling Last Access Time in Windows Vista to improve NTFS performance

und verstehen, dass es nicht ein „starken Schlüssel“ sein kann. Um dieses Problem zu beheben, stoppen wir nur auf

GetLastWriteTime 

Anrufweiterleitung, sondern speichern zuletzt geändert Wert der Datei oder in seinem Namen, wie „FileName_yyyymmdd“, oder im Innern, die Datei in einem Feld.

Es gibt eine andere Lösung für GetLastAccessTime hier finden:

.NET FileInfo.LastWriteTime & FileInfo.LastAccessTime are wrong, könnte auch in Ihrem Fall nützlich sein.

Meine allgemeine Meinung zu diesem wäre: nicht auf diesen Parameter weiterleiten, sondern etwas anderes in Ihrer Architektur erfinden.

Viel Glück

+3

Ich hatte Kopfschmerzen mit Dateierstellungsdatum. Wenn Sie eine Datei erstellen, löschen und neu erstellen (mit demselben Namen), wird das Erstellungsdatum der zuvor erstellten Datei entsprechen. Nach einer Weile stellte ich fest, dass OS das Datum aus dem Cache wiederherstellt, wenn die Datei während 15s neu erstellt wurde. Die Lösung war der Name der Änderungsdatei jedes Mal, wie Sie erwähnt haben. – Reniuz

+1

@Reniuz: klingt vertraut :) Tatsächlich, da wir viele Kunden in völlig verschiedenen Ländern/Kulturen hatten, von Windows XP -> Windows7 64 Bit, die nicht zuverlässige Informationen wie das war absolut inakzeptabel. – Tigran

1

Tigran ist rechts:

Sie können versuchen, die Dateigröße ändert, zusätzlich zu den letzten Schreibzeit zu vergleichen. Es ist was ich mache (mit FileSystemWatcher, aber es ist vergleichbar mit Feldern in einem Zeitfenster vergleichen).

+0

Danke für diesen Eric! Daran habe ich noch nie gedacht! – DukeOfMarmalade