![]() |
FileExists liefert false bei existierenden Dateien
Moin!
Ich hab ein kleines Problem. Wie im Titel beschrieben liefert mir FileExists false, obwohl die Datei unter genau dem übergebenen Pfad existiert. Dazu kommt noch, dass sie es nicht immer tut. Ich habe zwei Dateien, die im gleichen Verzeichnis liegen - und beide einen identisch aufgebauten Dateinamen haben - von denen für die eine korrekt "true" geliefert wird, für die andere allerdings "false". Das ganze tritt im Rahmen einer Bildverwaltung auf. Darin sind zu 1000den von Bildern Dateipfad und Zusatzinfos in einer DB gespeichert. Sowohl die Pfade als auch die Dateinamen der Bilder werden nach einem festen Schema aufgebaut und jetzt muss ich leider feststellen, dass einige Bilder trotz korrekter Pfade und existierender Bilder nicht angezeigt werden können. Hab das ganze dann zurückverfolgt bis zur FileExists-Abfrage, die für die nicht angezeigten Bilder fehlschlägt. Nur seh ich absolut keinen Grund warum. Hab mir schonmal über den Debugger angeguckt, wohin denn abgefragt wird, aber die Pfade und Dateinamen sind in beiden Fällen korrekt. Wenn ich den "Pfad" über den Debugger auslese und in den Explorer kopiere bekomme ich auch in beiden Fällen die Datei angezeigt. Hat jemand evtl. noch ne Idee woran das liegen könnte? Gruß Mongfice |
Re: FileExists liefert false bei existierenden Dateien
Es koennte auch an fehlenden Rechten liegen
|
Re: FileExists liefert false bei existierenden Dateien
mhh, ne. Rechte sind auch in beiden Fällen identisch.
Allerdings hab ich bei dem Überprüfen der Rechte festgestellt, dass die nicht funktionierenden Dateien kein "Geändert am"-Datum haben - bzw. den 31.12.79 23:xx. |
Re: FileExists liefert false bei existierenden Dateien
Welchen Wert liefert FileAge für diese Datei?
In älteren Delphi-Versionen ist FileExists wie folgt implementiert:
Delphi-Quellcode:
Könnte also in deinem Fall das Dateialter = Wert für Datei nicht existent liefern.
Result := FileAge(FileName) <> -1;
Neuere Delphi-Versionen gehen hier anders vor wo fehlerhafte bestimmungen augeschlossen werden. |
Re: FileExists liefert false bei existierenden Dateien
Jop, FileAge liefert für die "defekten" Dateien -1.
Wenn ich diese Bilder nochmal mit ner Bildbearbeitung öffne und speicher werden die Bilder anschließend erkannt. Da muss ich dann wohl mal schauen warum die nen "falsche" FileAge bekommen. Allerdings liegt das wohl außerhalb meines Programms, da dort keine Bearbeitung vorgenommen wird. Vielen Dank!! |
Re: FileExists liefert false bei existierenden Dateien
Schreib dir ein eigenes FileExists mit
![]() |
Re: FileExists liefert false bei existierenden Dateien
Benutzt du Vista?
Es könnte an der Virtualisierung liegen. Schau mal, ob in dem Verzeichnis der Windows Explorer einen Toolbutton "Kompatibilität xx" oder so ähnlich anzeigt. |
Re: FileExists liefert false bei existierenden Dateien
Oder am Virenscanner...
Welchen hast Du installiert? Antivir? Mavarik :coder: |
Re: FileExists liefert false bei existierenden Dateien
Zitat:
![]() |
Re: FileExists liefert false bei existierenden Dateien
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
FileExists und FileAge lieferten in "alten" DelphiVersionen (dazu zählt auch D7) falsche Ergebnisse, da FileAge nicht erfolgreich war, wenn keine Zugriffsrechte bestannden.
function FileExists(const FileName: string): Boolean;
begin Result := FileAge(FileName) <> -1; end; Z.B. weil die Datei gerade geöffnet war und CreateFile keine SharingRechte bekam. Hier findet man Lösungen: ![]() Und falls dein Dateisystem wirklich futsch ist, hier ein kleiner Reparierer; (Hauptcode in Kurz) Der arbeitet sich ab seinem Arbeitsverzeichnis rekursiv nach unten durch, also Programm z.B. einfach ins Hauptverzeichnis des Laufwerkes kopieren und ausführen. Man kann es auch erstmal nur suchen lassen
Delphi-Quellcode:
Feler 32 = ERROR_SHARING_VIOLATION (The process cannot access the file because it is being used by another process)
Procedure TForm1.Repair(Const Dir: String);
Var SR: TSearchRec; FT: TFileTime; H: THandle; Begin If FindFirst(Dir + '*.*', faAnyFile, SR) = 0 Then Begin Repeat If (SR.Name = '.') or (SR.Name = '..') Then Continue; If (SR.Attr and faDirectory = 0) and (FileAge(Dir + SR.Name) < 0) Then Begin Memo1.Lines.Add(Dir + SR.Name); If not CheckBox1.Checked Then Begin GetSystemTimeAsFileTime(FT); H := CreateFile(PChar(Dir + SR.Name), FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); SetFileTime(H, nil, nil, @FT); CloseHandle(H); End; End; If SR.Attr and faDirectory <> 0 Then Repair(Dir + SR.Name + '\'); Until (FindNext(SR) <> 0) or Application.Terminated; FindClose(SR); End; End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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