Registriert seit: 15. Jul 2004
336 Beiträge
Delphi 7 Professional
|
Re: Frage zu Ordner kopieren
5. Apr 2005, 13:02
Ich hatte mir mal eine eigene Procedure geschrieben, die bisher bei mir immer funktioniert hat:
Delphi-Quellcode:
Procedure CopyDir(DirPath,NewPath: String; Cut:Boolean);
Procedure FindDirs(DirPath: String; StringList:TStrings; Recurse: Boolean = false);
var SR:TSearchRec;
begin
if AnsiLastChar(DirPath)^ <> '\'
then DirPath:=DirPath + '\';
// Ordner suchen
try
if FindFirst(DirPath+'*.*',faDirectory,SR)=0 then
repeat
if ((SR.Attr and faDirectory)<>0) and (SR.Name <> '.') and (SR.Name <> '..')
then begin
StringList.Add(DirPath+SR.Name+'\');
if Recurse
then FindDirs(DirPath+SR.Name,StringList,true);
end;
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
var SR:TSearchRec; i,MainDirIndex:integer; TargetDir: String; List1,List2:TStringList;
begin
List1:=TStringList.Create;
List2:=TStringList.Create;
try
if AnsiLastChar(DirPath)^ <> '\'
then DirPath:=DirPath + '\';
if AnsiLastChar(NewPath)^ <> '\'
then NewPath:=NewPath + '\';
List2.Add(DirPath);
FindDirs(DirPath,List2,true); // true = Recursive
// alle Dateien suchen
for i:=0 to List2.Count-1 do
if FindFirst(List2.Strings[i]+'*.*',faAnyFile,SR)=0 then
try
repeat
if SR.Attr and faDirectory <> faDirectory
then List1.Add(List2.Strings[i]+SR.Name);
until FindNext(SR)<>0;
finally
FindClose(SR);
end;
// Ordner erstellen
for i:=0 to List2.Count-1 do begin
TargetDir:=ExtractFilePath(List2.Strings[i]);
MainDirIndex:=pos(GetOnlyFolderName(DirPath),TargetDir)-1;
delete(TargetDir,1,MainDirIndex);
CreateDir(NewPath+TargetDir);
end;
// Dateien in ihre zugehörigen Ordner kopieren
for i:=0 to List1.Count-1 do begin
TargetDir:=ExtractFilePath(List1.Strings[i]);
MainDirIndex:=pos(GetOnlyFolderName(DirPath),TargetDir)-1;
delete(TargetDir,1,MainDirIndex);
if copyfile(PChar(List1.Strings[i]),PChar(NewPath+TargetDir+ExtractFileName(List1.Strings[i])),false)
then begin
if Cut then deletefile(List1.Strings[i])
end else showmessage('Die Datei '+List1.Strings[i]+' konnte nicht kopiert werden !');
end;
if Cut then DelTree(DirPath);
finally
List1.Free;
List2.Free;
end;
end;
Rekursives Kopieren ist hier bei standardmäßig eingestellt. Wenn du es benutzerdefiniert haben möchtest, musst du bei meinem Kommentar "// true = Recursive" ne Variable einsetzen und diese oben in die Procedure hinzufügen (aber weißte ja sicher).
|
|
Zitat
|