Entwickler-Ecke

Dateizugriff - FindFirst Keine Unterordner


Borlox - Mi 06.11.02 17:14
Titel: FindFirst Keine Unterordner
Was mache ich falsch? Er durchsucht keine Unterordner!!
Was ist an meinem Code falsch????


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:
Procedure FindFiles (aPath, aFindMask: String);
Var
  FindRec: tSearchRec;
Begin
  If FindFirst (aPath + aFindMask, faAnyFile, FindRec) = 0 Then
    Repeat 
      If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then
 showmessage(FindRec.Name);
    Until FindNext (FindRec) <> 0;
    if FindNext (FindRec)=0 then showmessage('Nichts');
  FindClose (FindRec);

  If FindFirst (aPath + '*.*', faAnyFile, FindRec) = 0 Then
    Repeat
      If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then
        If Boolean (FindRec.Attr and faDirectory) Then
          FindFiles (aPath + FindRec.Name, aFindMask);
    Until FindNext (FindRec) <> 0;
  FindClose (FindRec);

End;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FindFiles(PChar('C:\WINDOWS\Desktop\'), '*.jpg');
end;


AndyB - Mi 06.11.02 18:23

Zitat:
FindFirst(aPath + aFindMask, ...)

Ich würde sagen, dass du keine Unterordner in dem Verzeichnis hast, die der Maske "*.jpg" entsprechen.


Borlox - Mi 06.11.02 19:07
Titel: ???
Meinst du damit, dass ich keine Unterordner habe, in denen auch JPG-Dateinen sind?
Das ist leider nicht so, habe ich als erstes überprüft!!!
Leider findet er nur die Dateien, die direkt in dem Ordner sind!!


AndyB - Mi 06.11.02 19:36
Titel: Re: ???
Borlox hat folgendes geschrieben:
Meinst du damit, dass ich keine Unterordner habe, in denen auch JPG-Dateinen sind?

Nein, das meinte ich nicht. Aber ich hatte mich verlesen.



Der Fehler dürfte in dieser Zeile sein:

Quelltext
1:
FindFiles (aPath + FindRec.Name, aFindMask);                    

Dort hast du den abschließenden Backslash vergessen. Aus C:\Windows\Desktop\Unterordner wird im FindFirst-Aufruf C:\Windows\Desktop\Unterordner*.*

So müsste es funktionieren:

Quelltext
1:
FindFiles (aPath + FindRec.Name + '\', aFindMask);                    


Anonymous - Mi 06.11.02 20:36

Aus diesem Grung benutze ich auch kein Path und FindMask, sondern gebe das als ein String an (z.B. 'c:\temp\*.jpg').

Hier die veränderte Prozedur von mir. Da ich mich selbst um die Trennung kümmere, kann nicht passieren, daß am Pfad ein "\" fehlt.

Weiterhin würde ich faAnyFile nicht für die Suche benutzen, da du da viel unnütigen Müll mitbekommst.

Hier eine Prozedur die ich benutze. Sie ist außerden unabhängig von der ListBox. Das Ergebnis der Suche steht in einem String und kann später als Text an ein StringList Objekt übergeben werden.



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:
procedure GetAllFilesF(PathAndMask: String; var Text: String);
var Search: TSearchRec; Verz: String; Attrib: Integer;
begin
  Verz := ExtractFilePath(PathAndMask);
  Attrib := faArchive + faReadOnly + faHidden;

  if FindFirst(PathAndMask, Attrib, Search) = 0 then { suche Dateien }
    repeat Text := Text + Verz + Search.Name + ^j until FindNext(Search) <> 0;

  if FindFirst(Verz + '*.*', faDirectory, Search) = 0 then begin { durchsuche Unterordner }
    repeat
      if ((Search.Attr and faDirectory) = faDirectory) and (Search.Name[1] <> '.') then
        GetAllFilesF(Verz + Search.Name + '\' + ExtractFileName(PathAndMask), Text);
    until FindNext(Search) <> 0;
    FindClose(Search);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject); // Beispielaufruf
var Test: String;
begin
  GetAllFilesF('c:\temp\*.jpg', Test);
  ListBox1.Items.Text :=  Test;
  ShowMessage(IntToStr(ListBox1.Items.Count) + ' Daten gefunden');
end;