AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language FileExists liefert false bei existierenden Dateien
Thema durchsuchen
Ansicht
Themen-Optionen

FileExists liefert false bei existierenden Dateien

Ein Thema von Mongfice · begonnen am 27. Okt 2009 · letzter Beitrag vom 27. Okt 2009
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.379 Beiträge
 
Delphi 12 Athens
 
#1

Re: FileExists liefert false bei existierenden Dateien

  Alt 27. Okt 2009, 11:36
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)
Angehängte Dateien
Dateityp: exe project1_998.exe (505,0 KB, 4x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 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