Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie arbeitet FileExists intern? (https://www.delphipraxis.net/100264-wie-arbeitet-fileexists-intern.html)

richard_boderich 25. Sep 2007 13:01


Wie arbeitet FileExists intern?
 
Hallo

Ich habe ein Problem mit der FileExists Funktion. Kann mir eventuell jemand sagen, wie diese Funktion intern arbeitet bzw. welche Api's dazu benutzt werden?
Danke schonmal im vorraus.

Gruß Richard

s-off 25. Sep 2007 13:07

Re: Wie arbeitet FileExists intern?
 
Hallo,

die Funktion versucht einfach, mittels der Funktion 'GetFileAttributes' die Dateiattribute der im Paramteter übergebenen Datei abzufragen. Je nach Rückgabewert ist das Ergebnis von FileExists True oder False.

DeddyH 25. Sep 2007 13:08

Re: Wie arbeitet FileExists intern?
 
Delphi 5:
Delphi-Quellcode:
function FileAge(const FileName: string): Integer;
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
begin
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
    end;
  end;
  Result := -1;
end;

function FileExists(const FileName: string): Boolean;
begin
  Result := FileAge(FileName) <> -1;
end;

s-off 25. Sep 2007 13:11

Re: Wie arbeitet FileExists intern?
 
Hui, wie sich das doch ändern kann :?
Meine Version bezieht sich auf D2006.

RavenIV 25. Sep 2007 13:29

Re: Wie arbeitet FileExists intern?
 
Wie die Funktion intern abläuft, ist ja eigenzlich egal.
Hauptsache, das Ergebnis ist gleich.

Bei Delphi 2007 sieht's so aus:
Delphi-Quellcode:
function FileExists(const FileName: string): Boolean;
var
  Code: Integer;
begin
  Code := GetFileAttributes(PChar(FileName));
  Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0);
end;

s-off 25. Sep 2007 13:33

Re: Wie arbeitet FileExists intern?
 
Zitat:

Zitat von RavenIV
Wie die Funktion intern abläuft, ist ja eigenzlich egal.

Aber das war es ja, was er wissen wollte; wie es intern abläuft :wink:
Und da macht es dann ja schon Sinn, Unterschiede zwischen den einzelnen Versionen aufzuzeigen.

RavenIV 25. Sep 2007 13:37

Re: Wie arbeitet FileExists intern?
 
Übrigens ist es bei Delphi7 noch genauso wie bei Delphi 5.

generic 25. Sep 2007 14:02

Re: Wie arbeitet FileExists intern?
 
hat das problem mit entpackten dateien zu tun?
ich habe folgendes problem festgestellt:
archive mit 7-zip erstellt im zip format
archiv mit rar entpackt

die entpackten verzeichnisse und dateien konnten nicht mit fileexists gefunden werden.

richard_boderich 25. Sep 2007 14:08

Re: Wie arbeitet FileExists intern?
 
Hi

Ich habe das Problem, das FileExists immer das selbe Ergebnis liefert, egal ob die Datei nun vorhanden ist oder nicht.

Gruß Richard

RavenIV 25. Sep 2007 14:17

Re: Wie arbeitet FileExists intern?
 
Zitat:

Zitat von richard_boderich
Ich habe das Problem, das FileExists immer das selbe Ergebnis liefert, egal ob die Datei nun vorhanden ist oder nicht.

Kann es sein, dass der Pfad zur Datei nicht stimmt?
Und dass deshalb immer False geliefert wird?

Zeig doch mal ein Stückchen Code...

s-off 25. Sep 2007 14:19

Re: Wie arbeitet FileExists intern?
 
Hallo,

prüfst Du mit
Delphi-Quellcode:
if FileExists('...') then
[...]
end;
oder mit
Delphi-Quellcode:
if FileExists('...') = True then
[...]
end;
Desweiteren wöre es nett, zu wissen, ob das Ergebnis 'False' oder 'True' ist.

richard_boderich 25. Sep 2007 14:46

Re: Wie arbeitet FileExists intern?
 
@S-off

ich benutze erstere Methode. Das Ergebnis ist immer "true". Pfadangaben sind alle korrekt.

Gruß Richard

RavenIV 25. Sep 2007 14:51

Re: Wie arbeitet FileExists intern?
 
Wie schon geschrieben:
Zeig es uns.

richard_boderich 25. Sep 2007 15:06

Re: Wie arbeitet FileExists intern?
 
Hi Raven

Sache ist geklärt. FileExists macht das was es soll. Manchmal hatt man halt Tomaten auf den Augen. ;)
Trotzdem Danke an alle.

Gruß Richard

RavenIV 25. Sep 2007 15:08

Re: Wie arbeitet FileExists intern?
 
Ja und?
An was hat's gelegen?

Bitte auch immer die (selbst gefundene) Lösung posten, damit andere daraus lernen können...

Christian Seehase 25. Sep 2007 15:30

Re: Wie arbeitet FileExists intern?
 
Moin Richard,

Zitat:

Zitat von richard_boderich
Ich habe ein Problem mit der FileExists Funktion. Kann mir eventuell jemand sagen, wie diese Funktion intern arbeitet bzw. welche Api's dazu benutzt werden?
Danke schonmal im vorraus.

auch wenn das eigentliche Problem gelöst ist, noch ein kleiner Tip:
Da Du eine Enterprise Version hast, könntest Du Dir solche Fragen ggf. schon dadurch beantworten, dass Du die fragliche Funktion einfach mal mit gedrückter STRG-Taste anklickst.
Dann sollte sich die passende Unit öffnen, und das an der Stelle, an der die Funktion implementiert ist.
Ab der Pro-Version sind ja die Sourcen mit dabei.

shmia 25. Sep 2007 16:21

Re: Wie arbeitet FileExists intern?
 
Nachtrag:
Die FileExists() Funktion versagt unter Delphi 5-7, da unter gewissen Umständen die Funktion FileAge() versagt.
FileAge() versagt, wenn eine Datei kein gültiges Datum hat.
Das sollte eigentlich nie passieren; kann aber vorkommen.
Dies hängt aber auch mit dem unterliegenden Filesystem zusammen.
Wenn z.B. ein IBM AS400 eine NETBIOS Freigabe anbietet, kann es passieren, das FileExists() False meldet, obwohl die Datei definitiv vorhanden ist. (weil das Datum "kaputt" ist)
In Beitrag #5 steht dann der Workaround.

richard_boderich 25. Sep 2007 17:04

Re: Wie arbeitet FileExists intern?
 
@ Christian Seehase

Danke dir vielmals du, das ist ein toller Tip. Hab ich gar nicht gewusst das es sowas gibt.

@ Raven

Hatte bei einer mehrbedingungs If-Abfrage die Klammern falsch gesetzt. Deshalb war das Ergebnis der Funktion am Ende immer
"true".

mfG Richard

jbg 25. Sep 2007 17:29

Re: Wie arbeitet FileExists intern?
 
Zitat:

Zitat von shmia
Die FileExists() Funktion versagt unter Delphi 5-7, da unter gewissen Umständen die Funktion FileAge() versagt.

FileAge ist auch grotten lahm im Vergleich zu GetFileAttributes (ein Grund warum der C++ IDE Compiler so langsam war)

Chemiker 25. Sep 2007 18:44

Re: Wie arbeitet FileExists intern?
 
Hallo Christian Seehase,

Dein Tipp mit der gedrückter STRG - Taste anklicken und die passende Unit wird geöffnet, ist wirklich sehr hilfreich!
Sollte vielleicht mit in die Standard –Tastaturvorlage aufgenommen werden!
Gibt’s da noch mehr, was man wissen sollte?

Bis bald Chemiker

halinchen 25. Sep 2007 18:58

Re: Wie arbeitet FileExists intern?
 
http://www.delphipraxis.net/internal...t.php?t=118707

http://www.delphipraxis.net/internal...t.php?p=264935


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