![]() |
Schnelle Methode, um eine Dateiliste zu erstellen
Vielleicht erst ein kleiner Hintergrund.
Ich habe früher mal anhand zweiter StringListen, die gefüllt sein können aber nicht müssen, eine weitere Liste erstellen lassen (eine Dateiliste). Die eine StringListe enthielt (kann, muss nicht) Pfade, die unbedingt vom Such-Algorithmus (bei mir damals FindFirst, FindNext) in der neuen Dateiliste aufgenommen werden sollen. Die zweite StringListe enthielt Pfade, die in keinem Fall in der Dateiliste aufgenommen werden sollen. Beispiele: - war die erste StringListe gefüllt, wurden auch nur diese Pfade in der neuen Dateiliste aufgenommen. - war die zweite gefüllt, wurden alle außer die in der Liste in die Dateiliste aufgenommen. Basierend auf einem Verzeichnis "E:\": diese StringListen können beispielsweise enthalten - Dateien - Arbeit - Freizeit\Fotos Im o.g. Beispiel würden nur die Verzeichnisse "Dateien", "Arbeit" und "Freizeit\Fotos" in die neue Dateiliste übernommen (erste Liste) ODER alle außer genau die oben genannten (zweite Liste). Meine vorgehensweise damals war in etwa so: - FindFirst/FindNext-Procedure (in sich selbst aufrufend, wegen der Unterverzeichnisse) -- jede Datei, jedes Verzeichnis das gefunden wird durch eine Funktion laufen lassen, die eine Schleife durchläuft und die StringListe prüft. Und irgendwie habe ich beide Listen in das ganze Ding reingepackt mit if's und else's und viel zu kompliziert. Wie realisiert man sowas mit D10.3.3 am besten? Ich habe leider keinen Code mehr davon. Ich weiß nur noch, dass das mit StringListen-Abgleich mindestens um den Faktor 10 langsamer war als ohne. |
AW: Schnelle Methode, um eine Dateiliste zu erstellen
Naja, du könntest mal anschauen was IOUtils so alles bietet.
Zum Beispiel TPath... |
AW: Schnelle Methode, um eine Dateiliste zu erstellen
Die Anforderungen sind aber noch nicht vollständig definiert, oder?
Was soll passieren, wenn beide Listen gefüllt sind? Welche Liste hat Vorrang, wenn die Listen sich widersprechen? |
AW: Schnelle Methode, um eine Dateiliste zu erstellen
Zitat:
Ist die erste Liste gefüllt, wird die zweite gar nicht erst befüllt und kann ignoriert werden. Wie das andersherum aussieht, muss ich noch überlegen. Die erste Liste soll ausschließlich ihre Einträge vergleichen und Funde in eine Dateiliste schreiben. Die zweite Liste soll ihre Einträge vergleichen und Funde sollen nicht zur Dateiliste hinzugefügt werden. |
AW: Schnelle Methode, um eine Dateiliste zu erstellen
Das mit den verschiedenen Listen habe ich noch nicht so ganz verstanden, jedenfalls finde ich die schnellste Methode es über PItemIdList zu Lösen. Es ist gleichzeitig nicht die einfachste Möglichkeit da mehr Code benötigt wird.
In der Paxis kannst Du es testen indem Du mal TotalCommander (Shareware Datei-Manager) installierst und in ein Verzeichnis mit Tausenden von Dateien lotst. Gegenüber FindFirst() ist das der Ferrari :) In Kombination mit einem Verzeichnis-Monitor wirst du eventuell gar keine zwei Listen benötigen sondern einfach PIDLs sich selbst aktualisieren lassen. Es gab mal eine VirtualShellView Demo von Borland um sich damit anzufreunden. Vielleicht liege ich auch total daneben, dann tut es mir leid. |
AW: Schnelle Methode, um eine Dateiliste zu erstellen
Zitat:
Diese StringListen können beispielsweise nach einer Eingabe diesen Inhalt haben - Dateien - Arbeit - Freizeit\Fotos Wenn das da oben in der ersten Liste steht: nur die Verzeichnisse "Dateien", "Arbeit" und "Freizeit\Fotos" würden in die neue Dateiliste übernommen ODER wenn das in der zweiten Liste streht: alle außer genau die oben genannten werden in die neu Dateiliste übernommen. Also quasi "Füge nur diese Dateien (wenn gefunden) in die Dateiliste ein (erste Liste) oder füge alle Dateien außer die oben (wenn gefunden) in die Dateiliste ein (zweite Liste). |
AW: Schnelle Methode, um eine Dateiliste zu erstellen
Man benötigt eigentlich immer zumindest ein zu durchsuchendes Verzeichnis.
Deshalb würde ich dieses in der Liste der zu durchsuchenden Verzeichnisse übergeben. Die Verzeichnisse, die von der Suche ausgeschlossen sind, sollten aber dann höhere Priorität haben. Bsp. Wenn "c:\" dursucht werden soll und "c:\temp" ausgeschlossen ist. Ungetestet:
Delphi-Quellcode:
procedure FindFiles(ADirList: TStrings; const AFileMask: string; AExcludeDirList: TStrings; AFileList: TStrings);
var SubDirList: TStringList; FindInfo: TSearchRec; sDir: string; begin SubDirList := TStringList.Create; try for sDir in ADirList do begin if AExcludeDirList.IndexOf(sDir) < 0 then begin if FindFirst(sDir + AFileMask, faAnyFile, FindInfo); then begin try repeat if (FindInfo.Attr and faDirectory) = faDirectory then begin if (FindInfo.Name <> '.') and (FindInfo.Name <> '..') then SubDirList.Add(sDir + FindInfo.Name + '\'); end else AFileList.Add(sDir + FindInfo.Name); until not FindNext(FindInfo); finally FindClose(FindInfo); end; end; if SubDirList.Count > 0 then begin FindFiles(SubDirList, AFileMask, AExcludeDirList, AFileList); SubDirList.Clear; end; end; end; finally SubDirList.Free; end; end; |
AW: Schnelle Methode, um eine Dateiliste zu erstellen
Zitat:
Die beiden Listen dürfen nur Unterverzeichnisse dieses Verzeichnisses beinhalten. |
AW: Schnelle Methode, um eine Dateiliste zu erstellen
Keine Ahnung ob das schneller ist, aber könnte man nicht erst nur nach Verzeichnissen suchen, die den Kriterien entsprechen und diese in eine Liste schreiben und dann anschließen in allen Verzeichnissen in dieser Liste die Dateien suchen?
|
AW: Schnelle Methode, um eine Dateiliste zu erstellen
Zitat:
1: Eine List von Verzeichnissen soll durchsuncht werden, einschliesslich Unterverzeichnisse.
Delphi-Quellcode:
2: Ein Verzeichnis soll durchsucht werden, einschliesslich Unterverzeichniss. Bestimmte Unterverzeichnisse sollen komplett ausgeschlossen werden.
procedure Fall1(ASuchList: TStrings; const AFileMask: string; AFileList: TStrings);
var EmptyList: TStringList; begin EmptyList := TStringList.Create; try FindFiles(ADirList, AFileMask, EmptyList, AFileList); finally EmptyList.Free; end; end;
Delphi-Quellcode:
procedure Fall2(const ASuchDir: string; const AFileMask: string; AExcludeDirList: TStrings; AFileList: TStrings);
var DirList: TStringList; begin DirList := TStringList.Create; try DirList.Add(ASuchDir); FindFiles(DirList, AFileMask, EmptyList, AFileList); finally DirList.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 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