Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit FileTime-Vergleich (https://www.delphipraxis.net/117441-problem-mit-filetime-vergleich.html)

JayBee 18. Jul 2008 00:40


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:
FTime := StrToInt(t[2]);
eingelesen, wobei t als array of string deklariert ist - ich weiß, nicht schön aber es klappt ;)

marabu 18. Jul 2008 08:04

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 Windows SDK normieren.

Welchen Zeitstempel deiner Datei versuchst du wie zu verändern? Die Dokumentation zu SetFileTime() beschreibt das Problem für NTFS ganz gut. Das fällt dir natürlich nie auf, wenn du nur die inzwischen veraltete Dokumentation konsultierst, die bei D5 mit ausgeliefert wurde.

Grüße vom marabu

SirThornberry 18. Jul 2008 08:10

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.

JayBee 18. Jul 2008 12:28

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:
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;
Das is doch wieder so ein total trivialer Fehler den nur ich nich sehe :?
Grüße
JayBee

/edit: Die Dateien sind auch nicht schreibgeschützt - Als einziges ist das Archiv-Bit gesetzt.

SirThornberry 18. Jul 2008 12:36

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.

JayBee 18. Jul 2008 12:42

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

SirThornberry 18. Jul 2008 12:45

Re: Problem mit FileTime-Vergleich
 
Sind die 87 Stück vielleicht Ordner oder Elemente auf die du keinen Zugriff hast?

JayBee 18. Jul 2008 12:59

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.

lbccaleb 18. Jul 2008 13:51

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...

JayBee 18. Jul 2008 13:59

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 19:45 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz