Entwickler-Ecke

Dateizugriff - ...nach Dateien mit unterschiedlichen Erweiterungen suchen?


Popov - Di 27.01.04 22:10
Titel: ...nach Dateien mit unterschiedlichen Erweiterungen suchen?
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 [http://www.delphi-forum.de/viewtopic.php?t=94]).

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; [http://www.delphiforum.de/viewtopic.php?p=124922]
  2. und eine Erweiterte, bei der man auch in Dateinamen einen Filter angeben kann. [http://www.delphiforum.de/viewtopic.php?p=124923]


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


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".


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:


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


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".


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


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;