Dateien in Unterverzeichnissen aufspüren

Hallo,

ich möchte mir mit Delphi 5.0 ein Datensicherungsprogramm schreiben, das bestimmte Dateien und Verzeichnisse auf eine externe Festplatte kopiert. Solange ich konkrete Dateien mitsamt ihrem Pfad in meine Stringliste eintrage, ist das auch kein Problem. Doch wenn da eine Verzeichnisangabe steht, möchte ich natürlich nicht nur die darin enthaltenen Dateien, sondern auch alle in eventuell vorhandenen Unter-und UnterUnterverzeichnissen enthaltenen Dateien umkopieren.
Doch damit scheint ein Programmierlaie wie ich überfordert zu sein. Um die eventuell vorhandenen Unterverzeichnisse aufzuspüren, verstricke ich mich in einem hoffnungslosen Gewirr von Schleifen, aus denen es dann irgendwann keinen Ausweg mehr gibt.

Wie macht denn sowas ein Profi?

Oder gibt es vielleicht sogar einen fertigen Befehl für so eine Aufgabe? So ähnlich wie: xcopy C:\eigeneDateien*.* D:*.* ?

Hallo!

Dazu gibt es zwei Möglichkeiten:
1: Selber programmieren:

So etwas lässt sich am besten mit einer Rekursion verwirklichen. Dies ist eine Methode, die sich selbst wieder aufruft.

Hier die Procedur:

procedure tform1.tree(dir: string);
var
 f: tsearchrec;
 error: integer;
 cdir: string;
begin
 memo1.lines.add(dir);

 // hier kannst du dann die Dateien suchen

 // und nächstes Verzeichnis
 if dir[length(dir)] '\' then
 dir := dir+'\';
 error := findfirst(dir+'\*.\*',$10,f);
 while error = 0 do
 begin
 if (f.name '..') and (f.name '.') and (f.attr and $10 \> 0) then tree(dir+f.name);
 error := findnext(f);
 end;
 findclose(f);
end;

In diese Procedure kannst du dann die Schleife für die Dateien einbauen. Aufrufen einfach mit dem Verzeichnis das du durchsuchen willst.

2: Die Shellfunktion von Windows verwenden:
Hier ein Beispiel:

uses Shellapi; 

... 

TSHFileOpStructA = record 
 Wnd:HWnd; 
 wFunc:Uint; 
 pFrom:stuck\_out\_tongue:AnsiChar; 
 pTo:stuck\_out\_tongue:AnsiChar; 
 fFlags:FILEOP\_FLAGS; 
 fAnyOperatiosAborted:Bool; 
 hNameMappings:stuck\_out\_tongue:ointer; 
 lpszProgressTitle:stuck\_out\_tongue:AnsiChar; 
end; 

procedure TForm1.Button1Click(Sender:TObject); 
begin 
 with shellinfo do 
 begin 
 wnd := handle; 
 wFunc := FO\_COPY; //or FO\_MOVE or FO\_DELETE 
 pFrom := 'C:\Autoexec.bat'; 
 pTo := 'c:\windows\system'; 
 end; 

 SHFileOperation(shellinfo); 
end; 

Hier überlässt du dem System das Kopieren. Ist zwar einfacher, aber schlecht zur Fehlerkorrektur. Ausserdem werden da alle dateien Kopiert.

Ich hoffe ich konnte dir Helfen!

MFG, Volker