Thema: Delphi Frage zu Ordner kopieren

Einzelnen Beitrag anzeigen

Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#14

Re: Frage zu Ordner kopieren

  Alt 5. Apr 2005, 12: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).
  Mit Zitat antworten Zitat