Autor |
Beitrag |
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Di 27.01.04 22:10
Um nach bestimmten Dateien auf der Festplatte zu suchen muss man die Funktionen FindFirst und FindNext benutzen. Das Problem ist, daß dabei nur nach einem Datentyp gesucht wird. Wie man rekursiv nach Dateien in Unterverzeichnissen sucht, da gibt es genug Beispielfunktionen ( siehe auch Beispiel hier in der FAQ).
Dieser Tipp zeigt wie man nach Daten mit mehreren Erweiterungen sucht, z.B. BAT und COM und EXE gleichzeitig.
Ich biete hier zwei Varianten an: - eine Einfache, bei der es möglich ist nur Erweiterungen anzugeben;
- und eine Erweiterte, bei der man auch in Dateinamen einen Filter angeben kann.
_________________ Popov
Zuletzt bearbeitet von Popov am Do 29.01.04 23:45, insgesamt 3-mal bearbeitet
|
|
Popov 
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Di 27.01.04 22:11
Titel: GetAllFilesEM
Version 1: GetAllFilesEM
Das EM steht für ExtMask. Hier dürfen nur Erweiterungen angegeben werden.
Die Prozedur erwartet vier Parameter:
- Das Verzeichnis (z.B. 'C:\Windows')
- Die vereinfachte Suchmaske (z.B. '*' oder 'bmp' oder 'bmp, jpg, jpeg, gif')
- Die Ausgabeliste (z.B. Listbox1.Items)
- Suche in Unterordnern (bei True werden die auch Unterordner durchsucht; bei False wird nur der Hauptordner beachtet)
Wie man sieht, kann die Maske mehrere Erweiterungen enthalten. Werden mehrere Erweiterungen verwendet, dann bitte die einzelnen Erweiterungen mit Komma trennen. Für alle Daten ein Stern "*" als Suchmaske angeben. Werden Dateien nur eines bestimmten Typs gesucht, dann nur eine Erweiterung angeben, z.B. "EXE".
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| procedure GetAllFilesEM(Path, ExtMask: String; List: TStrings; SubFolder: Boolean); var Attrib, k: Integer; Search: TSearchRec; begin Attrib := faArchive + faReadOnly + faHidden;
if Path[Length(Path)] <> '\' then Path := Path + '\';
with TStringList.Create do try CommaText := ExtMask;
for k := 0 to Count - 1 do if FindFirst(Path + '*.' + Strings[k], Attrib, Search) = 0 then repeat List.Add(AnsiUpperCase(Path + Search.Name)); until FindNext(Search) <> 0;
FindClose(Search); finally Free end;
if SubFolder then begin if FindFirst(Path + '*.*', faDirectory, Search) = 0 then begin repeat if ((Search.Attr and faDirectory) = faDirectory) and (Search.Name[1] <> '.') then GetAllFilesEM(Path + Search.Name, ExtMask, List, SubFolder); until FindNext(Search) <> 0;
FindClose(Search); end; end; end; |
Beispiel für Suche nach allen EXE Programmen:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin GetAllFilesEM('c:\programme', 'exe', ListBox1.Items, True); end; |
Beispiel für Suche nach allen Bildern:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin GetAllFilesEM('c:\programme', 'bmp, gif, jpg, ico', ListBox1.Items, True); end; |
_________________ Popov
|
|
Popov 
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Di 27.01.04 22:12
Titel: GetAllFilesM
Version 2: GetAllFilesM
Das M steht für Mask. Hier dürfen Filter in Namen und Erweiterungen angegeben werden.
Die Prozedur erwartet vier Parameter:
- Das Verzeichnis (z.B. 'C:\Windows')
- Die Suchmaske (z.B. '*.*' oder 'a*.bmp' oder 'a*.bmp, b*.jpg, b*.jpeg, c*.gif')
- Die Ausgabeliste (z.B. Listbox1.Items)
- Suche in Unterordnern (bei True werden die auch Unterordner durchsucht; bei False wird nur der Hauptordner beachtet)
Wie man sieht, kann die Maske mehrere Erweiterungen enthalten. Werden mehrere Erweiterungen verwendet, dann bitte die einzelnen Erweiterungen mit Komma trennen. Für alle Daten "*.*" als Suchmaske angeben. Werden Dateien nur eines bestimmten Typs gesucht, dann nur eine Erweiterung angeben, z.B. "*.EXE".
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| procedure GetAllFilesM(Path, Mask: String; List: TStrings; SubFolder: Boolean); var Attrib, k: Integer; Search: TSearchRec; begin Attrib := faArchive + faReadOnly + faHidden;
if Path[Length(Path)] <> '\' then Path := Path + '\';
with TStringList.Create do try CommaText := Mask;
for k := 0 to Count - 1 do if FindFirst(Path + Strings[k], Attrib, Search) = 0 then repeat List.Add(AnsiUpperCase(Path + Search.Name)); until FindNext(Search) <> 0;
FindClose(Search); finally Free end;
if SubFolder then begin if FindFirst(Path + '*.*', faDirectory, Search) = 0 then begin repeat if ((Search.Attr and faDirectory) = faDirectory) and (Search.Name[1] <> '.') then GetAllFilesM(Path + Search.Name, Mask, List, SubFolder); until FindNext(Search) <> 0;
FindClose(Search); end; end; end; |
Beispiel für Suche nach allen EXE Programmen die mit einem W anfangen (inc. Unterordner):
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin GetAllFilesM('c:\windows', 'w*.exe', ListBox1.Items, True); end; |
Beispiel für Suche nach allen Bildern die mit einem A anfangen (inc. Unterordner):
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin GetAllFilesM('c:\eigene dateien', 'a*.bmp, a*.jpg, a*.gif', ListBox1.Items, True); end; |
Tipp:
Es ist besser die einzelnen Masken in Anführungszeichen zu setzten. Dadurch vermeidet man, daß bei langen Dateinamen die Parameter falsch verstanden werden. Beispiel:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin GetAllFilesM('c:\eigene dateien', '"a*.bmp", "a*.jpg", "a*.gif"', ListBox1.Items, True); end; |
_________________ Popov
|
|
|