Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi schnelle Alternative für FileExists() (https://www.delphipraxis.net/139883-schnelle-alternative-fuer-fileexists.html)

luke2 7. Sep 2009 16:17


schnelle Alternative für FileExists()
 
Hallo,

Ja, der Titel sagt schon alles. Kennt da jemand etwas?
Ich habe es schon mit GetFileAtrributes() und FindFirstFile() versucht. Ist leider nicht wirklich schneller.

Danke schonmal.

Neutral General 7. Sep 2009 16:18

Re: schnelle Alternative für FileExists()
 
Vielleicht CreateFile?

Aber keine Ahnung.. Warum muss es denn so schnell sein?

DeddyH 7. Sep 2009 16:20

Re: schnelle Alternative für FileExists()
 
CreateFile wollte ich auch gerade vorschlagen (OPEN_EXISTING aber nicht vergessen).

himitsu 7. Sep 2009 16:20

Re: schnelle Alternative für FileExists()
 
unter diesen Umständen ist das das Schnellste, denn das Dateisystem ist langsam.

Und ich glaube nicht,daß du dich mit dem Dateisystem auseinandersetzen willst/kannst und direkt aus der MFT ausließt (falls es sich überhaupt um NTFS handelt)

[add]
CreateFile hat den Nachteil, daß die Datei gesperrt sein kann und man so keinen Zugriff bekommt ... drum wird ja GetFileAtrributes verwendet und wenn dieses "Schnelle" nicht geht, dann das langsamere FindFirstFile.

luke2 7. Sep 2009 16:38

Re: schnelle Alternative für FileExists()
 
Habe CreateFile() gerade ausprobiert, aber ist auch nicht wirklich schneller.
Eine FastFileExists() Funktion, die auch mit GetFileAttributes arbeitet habe ich hier auch gerade gefunden, aber diese ist genauso schnell, wie das original FileExists().
Ich werde es dann wohl dabei belassen.

Dennoch Danke!

himitsu 7. Sep 2009 16:45

Re: schnelle Alternative für FileExists()
 
Zitat:

Zitat von luke2
Eine FastFileExists() Funktion, die auch mit GetFileAttributes arbeitet habe ich hier auch gerade gefunden, aber diese ist genauso schnell, wie das original FileExists().
Ich werde es dann wohl dabei belassen.

Sagen wir es mal anders ... früher hatte Delphi nur FindFirstFile genutzt
und sie haben irgendwann bei sich dieses gegen die Fast-Version ausgetauscht :zwinker:

Schmugo58 3. Jul 2013 11:14

AW: schnelle Alternative für FileExists()
 
FindFirst aus SysUtils ist schneller
Willi

jbg 3. Jul 2013 11:49

AW: schnelle Alternative für FileExists()
 
Zitat:

Zitat von Schmugo58 (Beitrag 1220564)
FindFirst aus SysUtils ist schneller

Aber nur in der Wunschvorstellung. Denn FindFirst ruft wieder FindFirstFile auf. Schneller als GetFileAttribute geht es nicht aus dem User-Space heraus. GetFileAttribute wird dann langsam wenn kein FAST I/O genutzt werden kann, da es dann auf eine langsamere Methode zurückfällt.

Wenn auf mehrere Dateien im gleichen Ordner (vor allem über eine Netzwerkfreigabe) zugegriffen werden soll, dann wäre es schneller mit FindFirstFile+FindNextFile alle Dateinamen des Ordners einzulesen und dann über eine Hash-Tabelle das FileExists abzubilden. Das setzt natürlich voraus, dass während der Abfragen nicht Dateien hinzukommen oder entfernt werden. So arbeitet z.B. der Delphi Compiler (mit IDEFixPack Plugin). Anstatt abertausender GetFileAttribute Aufrufe macht er einmalig für alle Bibliothekspfade ein FindFirstFile+FindNextFile und greift dann nur noch auf seinen Cache (Hash-Tabelle) zu.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr.

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