Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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:
  1. eine Einfache, bei der es möglich ist nur Erweiterungen anzugeben;
  2. 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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".

ausblenden volle Höhe Delphi-Quelltext
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{Popov}


Beispiel für Suche nach allen EXE Programmen:

ausblenden 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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".

ausblenden volle Höhe Delphi-Quelltext
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{Popov}


Beispiel für Suche nach allen EXE Programmen die mit einem W anfangen (inc. Unterordner):

ausblenden 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):

ausblenden 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:

ausblenden 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