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/)
-   -   FileExists liefert false bei existierenden Dateien (https://www.delphipraxis.net/142379-fileexists-liefert-false-bei-existierenden-dateien.html)

Mongfice 27. Okt 2009 07:06


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

mkinzler 27. Okt 2009 07:08

Re: FileExists liefert false bei existierenden Dateien
 
Es koennte auch an fehlenden Rechten liegen

Mongfice 27. Okt 2009 07:20

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.

Bernhard Geyer 27. Okt 2009 07:48

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:
  Result := FileAge(FileName) <> -1;
Könnte also in deinem Fall das Dateialter = Wert für Datei nicht existent liefern.
Neuere Delphi-Versionen gehen hier anders vor wo fehlerhafte bestimmungen augeschlossen werden.

Mongfice 27. Okt 2009 07:58

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

Luckie 27. Okt 2009 08:45

Re: FileExists liefert false bei existierenden Dateien
 
Schreib dir ein eigenes FileExists mit Delphi-Referenz durchsuchenFindFirstFile.

Dezipaitor 27. Okt 2009 08:58

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.

Mavarik 27. Okt 2009 09:06

Re: FileExists liefert false bei existierenden Dateien
 
Oder am Virenscanner...

Welchen hast Du installiert? Antivir?

Mavarik :coder:

mirage228 27. Okt 2009 11:32

Re: FileExists liefert false bei existierenden Dateien
 
Zitat:

Zitat von Luckie
Schreib dir ein eigenes FileExists mit Delphi-Referenz durchsuchenFindFirstFile.

Das Abrufen der Dateiattribute dürfte schneller sein ;) (Meine zumindest das so im Blog von Raymond Chen gelesen zu haben)

himitsu 27. Okt 2009 11:36

Re: FileExists liefert false bei existierenden Dateien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
function FileExists(const FileName: string): Boolean;
begin
  Result := FileAge(FileName) <> -1;
end;
FileExists und FileAge lieferten in "alten" DelphiVersionen (dazu zählt auch D7) falsche Ergebnisse, da FileAge nicht erfolgreich war, wenn keine Zugriffsrechte bestannden.
Z.B. weil die Datei gerade geöffnet war und CreateFile keine SharingRechte bekam.

Hier findet man Lösungen:
http://www.delphipraxis.net/internal...exists+fileage

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:
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;
Feler 32 = ERROR_SHARING_VIOLATION (The process cannot access the file because it is being used by another process)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 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