![]() |
Problem mit FileTime-Vergleich
Hallo,
Ich versuche nun seit über 3 Stunden, 2 Dateidaten zu vergleichen, die Ergebnisse sind immer unterschiedlich aber jedesmal falsch. Mein Programm Vergleicht das Datum einer Datei auf der Festplatte (welches ich via FileAge() auslese) mit einem als TFileDate/Integer gespeicherten Wert aus einer Datenbank. Sind die 2 Werte unterschiedlich, setzt es den Wert der Datei auf den gespeicherten Wert. Lasse ich mir die werte über IntToStr ausgeben, sehe ich 2 mal den selben Wert. Vergleiche ich die beiden Werte (if a <> b) sagt mir Delphi, die 2 Werte seien ungleich - selbst nach mehrmaligem schreiben des Wertes durch das Programm. Lasse ich mir die Differenz der Werte ausgeben (über IntToStr(a-b)), wird mir "0" angezeigt - bei einer Abfrage ist dieser Wert aber ungleich 0. In meiner Verzweiflung habe ich nun schon versucht, die Differenz der Werte in einen String und dann zurück in einen Integer umzuwandeln, da der "sichtbare" Wert ja 0 war - aber ebenfalls bekomme ich die Meldung der Wert sei ungleich 0. Habe auch schon im Forum gesucht - aber selbst die Abfrage |a-b| < 1 ist laut Delphi unwahr. Ich hoffe irgendwer hat den kleinen Denkanstoß der fehlt, um das ganze zu beheben... Grüße JayBee PS: Ich nutze Delphi 5 Personal, beide Werte sind als Integer Deklariert und der "Datenbankwert" wird über
Delphi-Quellcode:
eingelesen, wobei t als array of string deklariert ist - ich weiß, nicht schön aber es klappt ;)
FTime := StrToInt(t[2]);
|
Re: Problem mit FileTime-Vergleich
Moin JB,
die Zeitstempel einer Datei (LastAccessTime, CreationTime, ...) haben eine unterschiedliche Auflösung, die auch noch je nach Dateisystem (FAT, NTFS) variiert. Wenn du also einen Vergleich zwischen einem willkürlich festgelegten Zeitstempel und einem realistischen Zeitstempel durchführst, dann musst du den willkürlichen erst nach Maßgabe des ![]() Welchen Zeitstempel deiner Datei versuchst du wie zu verändern? Die Dokumentation zu ![]() Grüße vom marabu |
Re: Problem mit FileTime-Vergleich
wenn die ausgabe 0 ist sollte es auch mit der Vergleich stimmen erst recht wenn du vorher noch zu String convertierst und zurück.
Zeit doch mal den ganzen Quelltext. Ich vermute eher das du da irgendwo ausversehen die falschen Variablen miteinander vergleichst. Das einfachste ist übrigens einfach beim Vergleich mal den Debugger zu nutzen und sich die Werte der beiden Variablen anzeigen zu lassen. |
Re: Problem mit FileTime-Vergleich
Ok, auf die Idee mit dem Debugger hätte ich auch selber kommen können ^^
Dort werden mit nämlich tatsächlich verschiedene Werte angezeigt (bsp. 951815369 für Data.FTime und 954116721 für FileAge(FileName)). Den Wert 0 habe ich in meiner unachtsamkeit nach SetFileDate ausgeben lassen --> da war das Datum geändert und die Differenz logischerweise 0 --> mein Fehler :? Was mir aber nun schleierhaft ist: Wenn ich die Funktion zum Vergleichen und Ändern 2 mal aufrufe - direkt nacheinander - sagt er, das Datum sei noch immer Unterschiedlich. Das heißt für mich, dass der Wert (warum auch immer) nicht wirklich auf die Festplatte geschrieben wird. Wenn ich mir das im Windows Explorer angucke, sehe ich aber das "richtige", also das gespeicherte Datum - auch nach beendigung des Programms..... Die Funktion SetFileDate sieht so aus:
Delphi-Quellcode:
Das is doch wieder so ein total trivialer Fehler den nur ich nich sehe :?
function SetFileDate(const FileName: string; FileDate: Integer): Boolean;
var FileHandle: Integer; begin Result := False; FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone); if FileHandle > 0 then begin Result := (FileSetDate(FileHandle, FileDate) = 0); FileClose(FileHandle); end; end; Grüße JayBee /edit: Die Dateien sind auch nicht schreibgeschützt - Als einziges ist das Archiv-Bit gesetzt. |
Re: Problem mit FileTime-Vergleich
Ich denke (wie bereits auch schon gerschrieben wurde) das du einfach verschiedene Datumsformate vergleichst.
So gibt es eben einen UnixTimeStamp, ein TDateTime (Delphi-Datumswert), FileTime (abhängig von Zeitzone), FileTime (auf Festplatte vermerkte Zeit),..... und wenn du da nicht aufpasst verlgeichst du zwei völlig verschiedene Werte. Wenn du Beispielsweise eine Funktion hast welche ein TDateTime zum setzen des Dateidatums verwendest und danach mit einer anderen Funktion einen UnixTimeStamp ausliest so ist dieser verschieden im Vergleich zum TDateTimewert obwohl beide die gleiche Zeit beinhalten. |
Re: Problem mit FileTime-Vergleich
Den Wert in der Liste erhalte ich über einen SearchRec - SR.Time und den andren über FileAge
Gesetzt wird der Listenwert über FileSetDate(FileHandle, NewDate) auch bemerkenswert: bei 2281 Dateien funktioniert alles wie es soll - nur bei 87 nicht |
Re: Problem mit FileTime-Vergleich
Sind die 87 Stück vielleicht Ordner oder Elemente auf die du keinen Zugriff hast?
|
Re: Problem mit FileTime-Vergleich
Leider nein - alles Dateien wie die andren auch. Teilweise habe ich hier Ordner, in denen 30 Dateien sind (alles Bilder von der Digitalkamera) - von 28 wird das Datum ordentlich gesetzt, bei 2 nicht.
|
Re: Problem mit FileTime-Vergleich
hast du diese dateien vllt versehentlich geöffnet, also mit einem anderen programm zugriff auf die dateien??
oder zb mit dem explorer gerade den ordner geöffnet, dann kann es sein, das einige dateien keine zugriff haben, weil der explorer sie gerade für die datei vorschau lädt... hab ich auch schon mal gehabt... |
Re: Problem mit FileTime-Vergleich
Hm... habe gerade folgendes versucht:
Alle Programme im Autostart deaktiviert, Rechner neugestartet, mein Programm gestartet, explorer.exe im Taskmanager beendet Trotzdem passiert nichts. Hat Vista irgendwelche Dienste die Dateien blockieren können? Suchindex habe ich asugeschaltet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz