Entwickler-Ecke

Dateizugriff - Verzeichnisinhalt rekursiv(!) auflisten


n-regen - Sa 13.09.08 17:38
Titel: Verzeichnisinhalt rekursiv(!) auflisten
Hallo!

Ich weiß sehr wohl, dass es hunderte von Themen in den verschiedensten Foren gibt, die zeigen, wie man die Dateien in einem Verzeichnis auflistet.
Ich brauche aber eine Funktion, die alle Dateien in einem Verzeichnis und seinen Unterordnern auflistet, die einer bestimmten Suchmaske entsprechen.
Meine Prozedur "Marke Eigenbau" versagt dabei kläglich:

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:
procedure ListFileDir(Path: string; FileList: TStrings; Recursive: Boolean);
var
  SR: TSearchRec;
begin
 if Path[length(Path)] <> '\'
 then Path := Path + '\';
  if FindFirst(Path + jvedit2.Text, faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Attr <> faDirectory) then
      begin
        FileList.Add(Path+SR.Name);
      end else begin
      if recursive
      then begin
        if sr.Name[length(sr.Name)] <> '\'
        then ListFileDir(Path+sr.Name+'\', FileList, true)
        else ListFileDir(Path+sr.Name, FileList, true);
      end;
      end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;


Boldar - Sa 13.09.08 17:48

Sorry, meine Kristallkugel hat grad nen Sprung^^
Was passiert denn? Was für eine Fehlermeldung?
Guck mal im debugger welcher Zweig der inneren if-Abfrage durchlaufen wird!


n-regen - Sa 13.09.08 18:08

Ich habe jetzt eine Lösung gefunden:

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:
procedure ListFileDir(Path: string; FileList: TStrings; Recursive: Boolean);
var
  SR,SR2: TSearchRec;
begin
 if Path[length(Path)] <> '\'
 then Path := Path + '\';
  if FindFirst(Path + jvedit2.Text, faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Attr <> faDirectory) then
      begin
        FileList.Add(Path+SR.Name);
      end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
  if recursive then begin
   if FindFirst(Path+'*', faAnyFile, SR2) = 0 then
  begin
    repeat
      if (SR2.Attr = faDirectory) then
      begin
        showmessage(sr2.Name);
        if (sr2.Name <> '.'and (sr2.Name <> '..'then begin
        if sr2.Name[length(sr2.Name)] <> '\'
        then ListFileDir(Path+sr2.Name+'\', FileList, true)
        else ListFileDir(Path+sr2.Name, FileList, true);
        end;
      end;
    until FindNext(SR2) <> 0;
    FindClose(SR2);
  end;
  end;
end;

Bitte achtet nicht so sehr auf meinen Programmierstil - Hauptsache, es funktioniert ;-)
Und Danke, dass du uns mit deiner Ironie erheitert hast.


n-regen - Fr 28.05.10 12:08

Da ich diese Funktion in den letzten Tagen mehrmals gebraucht habe, habe ich sie nochmal überarbeitet:

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:
uses SysUtils, Classes;

procedure DateienAuflisten(Pfad: string; DateiListe: TStrings; Rekursiv: Boolean = true; Suchmaske: string = '*');
var
  SR1, SR2: TSearchRec;
begin
  if Pfad[Length(Pfad)] <> '\'
  then Pfad := Pfad + '\';
  if FindFirst(Pfad + Suchmaske, faAnyFile, SR1) = 0
  then begin
    repeat
      if (SR1.Attr <> faDirectory)
      then DateiListe.Add(Pfad+SR1.Name);
    until FindNext(SR1) <> 0;
    FindClose(SR1);
  end;
  if Rekursiv then begin
    if FindFirst(Pfad+'*', faAnyFile, SR2) = 0
    then begin
      repeat
        if (SR2.Attr = faDirectory) and (SR2.Name <> '.'and (SR2.Name <> '..')
        then DateienAuflisten(Pfad+SR2.Name, DateiListe, true);
      until FindNext(SR2) <> 0;
      FindClose(SR2);
    end;
  end;
end;