![]() |
Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Hi,
ich muss einen Verzeichnisbaum einlesen und dabei Dateinamen, Dateigröße und Erstellungsdatum einlesen und mit einer Datenbank abgleichen. Tatsächlich handelt es sich nur um 2 Verzeichnisebenen. Allerdings immer über Netzwerk. Zur Zeit nutze ich FindFirst/FindNext, und das dann recursiv. Es handelt ich ca. um 37000 Dateien. Leider dauert das verhältnismäßig lange im Vergleich zur danach folgenden Datenbankoperation. Gibt es schon signifikant schnellere Möglichkeiten, oder ist da nicht mehr viel rauszuholen?
Delphi-Quellcode:
procedure TThreadLoadBilderArchivieren.BilderEinlesen(
Pfad: string); var sr: TSearchRec; b: TBild; begin if self.Terminated then Exit; if FindFirst(Pfad+'*.*', faAnyFile, sr)=0 then repeat if (sr.Name<>'.') and (sr.Name<>'..') and (LowerCase(sr.Name)<>'thumbs.db') then begin if sr.Attr and faDirectory = faDirectory then begin BilderEinlesen(Pfad+sr.Name+'\'); end else begin if ExtractFileExt(sr.Name)<>'.tmb' then begin b:=TBild.Create; b.lfdnr:=0; b.Pfad:=Pfad+sr.Name; b.Dateidatum:=FileDateToDateTime(sr.Time); b.Groesse:=sr.size; FBildList.Add(b); end; end; end; if self.Terminated then Break; until FindNext(sr)<>0; sysutils.FindClose(sr); end; |
AW: Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Nimm direkt die WinAPI
![]() PS: Aktuelle Delphis haben im TSearchRec ein Property, was dir direkt den TDateTime gibt. (ohne manuelles FileDateToDateTime) ![]() Tipp: Vielleicht nicht unbedingt schneller, aber "einfacher": ![]() ![]() |
AW: Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Danke
Zitat:
Aber die WinAPI werd ich mal ausprobieren. |
AW: Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Zitat:
![]() ![]() Und wegen Delphi 7: Die Unicode-Version (W), nicht ANSI (A). Bzw. direkt ![]() ![]() |
AW: Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Kannst Du mal vergleichen, ob deine Routine lokal (mit der passender Datenmenge) deutlich schneller ist, als über das Netz.
Meine D7-Variante für rekursives Dateiensuchen sieht Deiner Routine verblüffend ähnlich und ist sehr schnell. Den Flaschenhals vermute ich daher im Netzwerkzugriff und nicht in Deiner Routine. |
AW: Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Zitat:
|
AW: Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Zitat:
Ist möglich. Aber das Netzwerk beim Kunden liegt nicht unter meiner Kontrolle. Das muss ich in dem Fall so nehmen wie es ist. Ich kann (will) mir jetzt aber auch nicht die ganzen 37000 Dateien rüberholen um das bei mir zu testen ;-) |
AW: Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Du muss Dir ja nicht die Dateien des Kunden holen, es reicht ja, wenn Du Dir einen passenden Verzeichnisbaum mit (durchaus auch leeren Dateien) anlegst.
Oder nimm einfach Laufwerk C: und miss die Zeit. Zeit durch Anzahl Dateien = Durchschnittswert * 37.000 wäre die zu erwartende Zeit. Gibt's da große Unterschiede oder ist das eher vernachlässigbar? Große Unterschiede hieße für mich, dass der Flaschenhals eher im Netzwerk zu suchen ist, andernfalls in Deiner Routine. |
AW: Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Der Flaschenhals ist hier die Latenz beim Zugriff auf den Server. Es wird für jeden Abruf der jeweils nächsten Datei eine Anfrage an den Server geschickt und darauf gewartet.
Lösen kann man das auf zwei Wegen:
|
AW: Schnellste Möglichkeit einen Verzeichnisbaum einzulesen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 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