![]() |
Re: Neue Version von FindAllFiles
ich hab nochmal die richtige version in meinem Beitrag vom "12.07.2005 07:38" eingefügt.
Die falsche Zeile ist dort auch berichtigt, die Zeile wurde im ersten Beitrag versehentlich falsch geändert... @Flocke: deine Variante war fast richtig, der erste Parameter (FileList) gehört allerdings weg da er von der äußeren Procedure bereits gehalten wird und somit in der inneren nicht nötig ist. |
Re: Neue Version von FindAllFiles
Nein, ich habe deine letzte FindAllFiles Prozedur direkt kopiert und deinen Beispiel-Aufruf. Die Listbox bleibt leer und ich habe bessmmt Text-Dateien auf dem durchsuchten Laufwerk.
|
Re: Neue Version von FindAllFiles
@Luckie: ich hab das ganze heute kurz vor acht nochmal probiert nach dem ich es abgeändert hatte und es hat funktioniert. Kannst du mir dein Testprojekt mal mailen - vielleicht überseh ich ja irgendwas...
|
Re: Neue Version von FindAllFiles
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang.
OS ist Windows 2000 SP4 mit allen Patches und drum und darn. |
Re: Neue Version von FindAllFiles
Ich hab den Fehler gefunden. Die Version von Like die ich bei mir in einer Extra-Unit hab ist schon etwas älter und dort sind die Parameter der funktion "like" vertauscht. (wer kommt nur auf die Idee die Parameter im Nachhinein zu vertauschen *grummel*). Hier jetzt die Version die mit der aktuellen "Like" funktion getestet wurde.
Delphi-Quellcode:
procedure FindAllFiles(FileList: TStrings; RootFolder: string; Mask: string ='*'; Recurse: Boolean = True; AddFolderNames: Boolean = False; IgnoreMaskAtFolderNames: Boolean = True);
procedure LFindAllFiles(AParentFolder: String); var LSearchRec: TSearchRec; begin if FindFirst(AParentFolder + '*', faAnyFile, LSearchRec) = 0 then begin repeat if (LSearchRec.Name <> '.') and (LSearchRec.Name <> '..') then begin if LSearchRec.Attr and faDirectory = faDirectory then begin if AddFolderNames and (IgnoreMaskAtFolderNames or Like(AnsiLowerCase(LSearchRec.Name), Mask)) then FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(True)); if Recurse then LFindAllFiles(AParentFolder + LSearchRec.Name + '\'); end else if Like(AnsiLowerCase(LSearchRec.Name), Mask) then FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(False)); end; until FindNext(LSearchRec) <> 0; FindClose(LSearchRec); end; end; begin Mask := AnsiLowerCase(Mask); LFindAllFiles(IncludeTrailingPathDelimiter(RootFolder)); end; |
Re: Neue Version von FindAllFiles
Ah, jetzt geht es. Wie wäre es mit so was:
Delphi-Quellcode:
Also Suche mit mehreren Filtern?
FindAllFiles(ListBox1.Items, 'd:', '*.txt *.jpg', True);
|
Re: Neue Version von FindAllFiles
super Idee, und schon eingebaut
Delphi-Quellcode:
Als Delimiter wird "|" verwendet da dieses Zeischen nicht im Dateinamen vorkommen kann.
procedure FindAllFiles(FileList: TStrings; RootFolder: string; Mask: string = '*'; Recurse: Boolean = True; AddFolderNames: Boolean = False; IgnoreMaskAtFolderNames: Boolean = True);
procedure LFindAllFiles(AParentFolder: string; AMasks: TStrings); function LIsInMasks(AFilename: String): Boolean; var LCount: Integer; begin result := False; for LCount := 0 to AMasks.Count - 1 do begin if Like(AMasks.Strings[LCount], AFilename) then begin result := True; break; end; end; end; var LSearchRec : TSearchRec; begin if FindFirst(AParentFolder + '*', faAnyFile, LSearchRec) = 0 then begin repeat if (LSearchRec.Name <> '.') and (LSearchRec.Name <> '..') then begin if LSearchRec.Attr and faDirectory = faDirectory then begin if AddFolderNames and (IgnoreMaskAtFolderNames or LIsInMasks(AnsiLowerCase(LSearchRec.Name))) then FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(True)); if Recurse then LFindAllFiles(AParentFolder + LSearchRec.Name + '\', AMasks); end else if LIsInMasks(AnsiLowerCase(LSearchRec.Name)) then FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(False)); end; until FindNext(LSearchRec) <> 0; FindClose(LSearchRec); end; end; var LMasks: TStringList; begin LMasks := TStringList.Create; LMasks.Sorted := True; LMasks.Duplicates := dupIgnore; LMasks.Delimiter := '|'; LMasks.DelimitedText := AnsiLowerCase(Mask); LFindAllFiles(IncludeTrailingPathDelimiter(RootFolder), LMasks); LMasks.Free; end; Beispielaufruf (Zeigt alle *.txt und *.sys auf Laufwerk C und Unterordnern an)
Delphi-Quellcode:
ListBox1.Items.BeginUpdate;
FindAllFiles(ListBox1.Items, 'c:', '*.txt|*.sys', True); ListBox1.Items.EndUpdate; |
Re: Neue Version von FindAllFiles
Schön dass es jetzt funktioniert :thumb: (dafür dass ich "blinde" Korrekturvorschläge gegeben habe, lag ich gar nicht soooo schlecht... 8) )
Was ich noch schön/besser fände: 1. Du könntest die Suchparameter als Typ definieren, also:
Delphi-Quellcode:
Dann reduzierst du die Anzahl an Parametern und es ist später auch leicht erweiterbar, ohne dass du den Prototypen ändern musst.
TFindAllFilesOption = ( fafoRecurse, fafoAddFolderNames, fafoIgnoreMaskAtFolderNames );
TFindAllFilesOptions = set of TFindAllFilesOption 2. Das "Standard"-Trennzeichen zwischen Patterns ist das Semikolon (das nimmt auf jeden Fall der Explorer im Suchdialog), also: "*.bmp;*.jpg". Ggf. kannst du das ja noch als Parameter machen (aber dann wird die Parameterliste wieder länger). |
Re: Neue Version von FindAllFiles
ich weiß das bei windows standardmäßig ";" verwendet wird. Allerdings kann dieses Zeischen auch im Dateinamen vorkommen und ist somit nicht wirklich geeignet (keine Ahnung warum Microsoft das für die Suche verwendet hat)
|
Re: Neue Version von FindAllFiles
Kann es sein, dass du beim letzten Update (mehrere Masken) wieder die Parameter von "Like" vertauscht hast? Bei mir funktionierte deine sehr hilfreiche Funktion leider nicht.
Nachdem ich die Parameter beim Aufruf von Like vertauscht hab, funktioniert es wunderbar. Aber Hut ab, wirklich eine sehr praktische Funktion! :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 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