Autor Beitrag
Green
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 283

Windows XP Home
Delphi 6 Enterprise
BeitragVerfasst: Mo 31.07.06 13:56 
Wie kann ich ein Verzeichnis mit allen Unterverzeichnissen komplett durchsuchen, und für JEDE gefundene Datei etwas bestimmtes ausführen.

Verzeichnis
Ordner
-datei1
-datei2
Ordner2
-datei1
datei2

dabei sollen alle Dateien gefunden werden. von 'oben' nach unten.
ManniTwo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 46

Win XP SP III, Ubuntu 8.04, Debian 5.0
Delphi 5 Pro; Delphi 2005; C++,C# (VS 2005); Java, Ruby (Eclipse)
BeitragVerfasst: Mo 31.07.06 14:45 
Hi,

sicher hast du vor "FindFirst / FindNext" zu benutzen (Details dazu siehe Delphi-Hilfe).

Damit kann man auch nach Verzeichnissen suchen und zwar (auch in Delphi-Hilfe nachzulesen) erkennst du ein Verzeichnis daran, dass
ausblenden Delphi-Quelltext
1:
SearchRec.Attr AND faDirectory > 0					


Immer wenn du nun ein Verzeichnis findest, kannst du darin wieder (rekursiv) suchen und so alle Dateien finden.

Ein grobes Schema wäre also:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure findAllFilesAndDoSomething(_RootDir, _FileMask: String);
var
  SearchRec: TSearchRec;
begin
  // In FindFirst/FindNext alles suchen, was es gibt
  ....
  // Ist es ein Verzeichnis?
  if SearchRec.Attr and faDirectory > 0 then
    findAllFilesAndDoSomething(_RootDir + SearchRec.name, _FileMask) // Rekursion
  // Oder ist es eine Datei und passt zur Suchmaske?
  else if passtZurMaske(SearchRec.Name, _FileMask) then 
    doSomething(SearchRec.Name);
end;


Fiel mir grad noch ein: Bei der Prüfung ob es ein Verzeichnis ist, musst du vielleicht noch ausschließen, dass es sich um '.' oder '..' handelt, weil die auch als Verzeichnisse gelten....

_________________
Wer andern eine Bratwurst brät, der hat ein Bratwurst-Brat-Gerät, oder anders:
ausblenden Delphi-Quelltext
1:
if Self.BraetAndernEineBratwurst then Self.HasBratwurstBratGeraet := true;					
Green Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 283

Windows XP Home
Delphi 6 Enterprise
BeitragVerfasst: Mo 31.07.06 14:49 
Ok, das hat mir schonmal sehr geholfen.

Funktioniert alles.
mexx2k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 60



BeitragVerfasst: Di 28.08.07 12:53 
Was will diese Procedure denn als "_FileMask" haben?

Danke im vorraus
Wolle92
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: Di 28.08.07 13:58 
Ich hab da auch mal was gebastelt, ist Open Source:
File Search
Eines von vielen Programmen von mir, welches bei sowas wie Version 1.1 bleiben wird... und sich nie wieder verändern wird
Wobei ich glaub ich schonmal angefangen hab, an version 1.2 zu arbeiten
mexx2k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 60



BeitragVerfasst: Di 28.08.07 14:13 
Mein Ziel war es, ein bestimmtes Verzeichnis nach .mp3 Dateien zu durchsuchen.
Hier die Lösung

ausblenden 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 Tmp3_Explorer.FindFiles(sPfad: String);
var Rec:TSearchRec;
begin
   //Die beiden ersten gefundenen Einträge ignorieren
   FindFirst(sPfad+'\*.*', faAnyFile,Rec);
   FindNext(Rec); 

   if FindNext(Rec)=0 then
   begin
     repeat
       //frmzentral.mp3.Add(sPfad+'\'+Rec.Name);
       //wenn der Eintrag ein Verzeichnis ist, ebenfalls durchgehen
       if (Rec.Attr and faDirectory = faDirectory) then begin
         FindFiles(sPfad+'\'+Rec.Name);
       end
       else begin
        if ExtractFileExt(Rec.Name) = '.mp3' then begin
          ShowMessage(sPfad+'\'+Rec.Name);
        end;
       end;
     until FindNext(Rec)<>0;
   end;
   Findclose(Rec);
end;


Es werden natürlich auch Unterverzeichnisse rekursiv durchsucht


Zuletzt bearbeitet von mexx2k am Mi 29.08.07 07:35, insgesamt 1-mal bearbeitet
Wolle92
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: Di 28.08.07 15:09 
naja, bisschen scahuen hilft auch, dann wärst auf den Sourcecode von FileSearch gekommen...