![]() |
Nach Dateien suchen
Hallo,
habe nun heute schon mehrere Möglichkeiten gesehen wie man nach Dateien suchen kann. Jedoch hab ich das Ganze nicht so ganz verstanden. Ich möchte eigentlich nur ein Verzeichnis nach einer Datei durchsuchen. Also z. B. wenn ich in der Suche "Tomat" eingebe dann sollen mir folgende Dateien angezeigt werden: -Tomate.mp3 -Tomatensuppe.wav -etc.. Wer kann mir da ne Lösung sagen? Danke... Dragon27 P.s.: Vielleicht sollte man noch eine Maske eingeben können für *.wav und *.mp3. |
Re: Nach Dateien suchen
tsearchrec aus den sysutils sollte dir helfen
oder du schaust dir einmal twin32finddata (windowsapi) an. eine suche nach diesem thema in diesem forum/google bringt dir zig ergebnisse... |
Re: Nach Dateien suchen
Hallo,
danke für deine Antwort nur wie gesasgt ich versteh das Ganze nicht so..... ich möchte doch im Prinzip nur in ner Listbox dann die Dateien angezeigt bekommen..... Danke |
Re: Nach Dateien suchen
"verstehe ich nicht" gibts nicht - dann hat man sich noch nicht ausreichend mit der materie auseinandergesetzt.
man gibt einen pfad an ab dem man suchen will, nutzt tsearchrec, findfirst, findnext, prüft die gefundenen sachem it faanyfile oder fafolder und gibt ergänzt bei einem ergebnis die listbox mit listbox.items.add(...) |
Re: Nach Dateien suchen
Hallo Dragon27,
vielleicht enthält die Komponente ![]() Gruß Hawkeye |
Re: Nach Dateien suchen
Hallo,
die Verwendung von TSearchRec ist eigentlich ganz einfach. Trotzdem hier ein Beispiel für dich.
Delphi-Quellcode:
Du kannst das so in eine Listbox bringen:
function SearchMask(Root: string; Mask: string; Recursively: Boolean = false): TStrings;
var SRec: TSearchRec; FindPath: string; begin Result := TStringList.Create; Root := IncludeTrailingPathDelimiter(Root) // abschließenden Backslash hinzufügen FindPath := Root + Mask; FindFirst(FindPath, faDirectory, SRec); //Suche initialisieren repeat if (SRec.Attr and faDirectory <> 0) and Recursively then Result.AddStrings(SearchMask(Root + SRec.FileName + '\' + Mask)) //rekursieren else Result.Add(Root + SRec.FileName); //Kompletten Dateipfad zum Ergebnis hinzufügen while FindNext(SRec) = 0; //FindeNext gibt 0 zurück wenn es keinen Fehler gibt FindClose(SRec); //Ende der Suche end;
Delphi-Quellcode:
Optional werden auch alle unterordner durchsucht.
ListBox1.Items.AddStrings('C:\irgendwo\','Musik*');
|
Re: Nach Dateien suchen
Lukas, du solltest den Code noch einmal prüfen, der Compiler wird ihn inklusive Beispielaufruf zurückweisen. Zudem erzeugen die rekursiven Aufrufen Stringlisten, die nicht wieder freigegeben werden.
Gruß Hawkeye |
Re: Nach Dateien suchen
ok... mach ich... :gruebel:
EDIT: hast recht... waren einige unangenehme sachen drin...
Delphi-Quellcode:
dazu hätt ich jetzt aber selber ne Frage:
function TForm2.SearchMask(Root: string; Mask: string; Recursively: Boolean = false): TStrings;
var SRec: TSearchRec; FindPath: string; Temp: TStrings; begin Result := TStringList.Create; Root := IncludeTrailingPathDelimiter(Root); // abschließenden Backslash hinzufügen FindPath := Root + Mask; FindFirst(FindPath, faDirectory, SRec); //Suche initialisieren repeat if (SRec.Attr and faDirectory <> 0) and (SRec.Name <> '.') and (SRec.Name <> '..') and Recursively then begin Application.ProcessMessages; Temp := SearchMask(Root + SRec.Name,Mask,true); Result.AddStrings(Temp); //rekursieren Temp.Free; end else Result.Add(Root + SRec.Name); //Kompletten Dateipfad zum Ergebnis hinzufügen until FindNext(SRec) <> 0; //FindNext gibt 0 zurück wenn es keinen Fehler gibt FindClose(SRec); //Ende der Suche end; Kann das sein, dass der die Verzeichnisse auch nur rausgibt, wenn sie mit der Maske übereinstimmen? |
Re: Nach Dateien suchen
Ja, normalerweise benötigt man zwei Durchläufe pro Verzeichnis. Im ersten werden die Unterordner gesucht, im zweiten die Dateien (siehe
![]() ![]() Gruß Hawkeye |
Re: Nach Dateien suchen
Moin Lukas,
ich hätte da ein paar Verbesserungsvorschläge ;-) Bei FindFirst prüfst Du nicht, ob der Aufruf erfolgreich war. Resourcenschutzblock fehlt. TStrings würde ich nicht als Rückgabewerte nehmen, sondern als Parameter übergeben. Als Rückgabewert einer Funktion handelt man sich zu leicht ein Speicherleck ein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 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