Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ordner kopieren (https://www.delphipraxis.net/64756-ordner-kopieren.html)

Z32 7. Mär 2006 20:13


Ordner kopieren
 
Hallo,

Ich würde gerne wissen, ob es einen Befehl gibt, der einen bestimmten Ordner auf eine andere Partition oder auch in einen anderen Ordner KOPIERT. Der alte Ordner soltte trotzdem noch vorhanden sein.

Ich brauche den Befehl, für ein Sicherungsprogramm, dass regelmäßig verschiedene Ordner wo anders hinkopiert. Deshalb wäre es gut, wenn gleiche Dateien ersetzt würden.

Also ich bezweifele zwar, das es so einen Befehl gibt, aber fragen wollte ich trotzdem mal. :wink:

MathiasSimmack 7. Mär 2006 20:20

Re: Ordner kopieren
 
Gibt es. Die [dp="Ordner kopieren"]Suche[/dp] hilft: Hier im Forum suchenSHFileOperation.

ichbins 7. Mär 2006 20:48

Re: Ordner kopieren
 
SHFileOperation is aber nicht so gut, weil es die Windows Shell als Zwischenstufe verwendet (wie der Explorer).

eventuell dürften dir diese Funktionen weiterhelfen:
Delphi-Quellcode:
procedure getdirsindir(const verzeichniss:string;var dirs:tstringlist);
var
  sd:string;
  s:tsearchrec;
  i:integer;
begin
  dirs:=tstringlist.Create;
  sd:=dirup(verzeichniss);
  if findfirst(sd+'*.*',faanyfile,s)<>0 then begin
    sysutils.findclose(s);
    exit;
  end;
  dirs.add(s.Name);
  while findnext(s)=0 do
    dirs.Add(s.name);
  i:=0;
  while i<dirs.count do begin
    if ((dirs[i]='..') or (dirs[i]='.')) then begin
      dirs.Delete(i);
      i:=i-1;
    end else
      if not directoryexists(sd+dirs[i]) then begin
        dirs.Delete(i);
        i:=i-1;
      end;
    inc(i);
  end;
  sysutils.findclose(s);
end;

function getfilesindir(const verzeichniss,filter:string;var files:tstringlist):extended;
var
  sd:string;
  s:tsearchrec;
  i:integer;
  e:extended;
  flt:string;
begin
  if filter='' then
    flt:='*.*'
  else
    flt:=filter;
  e:=0;
  sd:=dirup(verzeichniss);
  result:=0;
  files:=tstringlist.Create;
  if findfirst(sd+flt,faanyfile,s)<>0 then begin
    sysutils.findclose(s);
    exit;
  end;
  files.add(s.Name);
  while findnext(s)=0 do begin
    files.Add(s.name);
    e:=e+s.Size;
  end;
  i:=0;
  while i<files.count do begin
    if ((files[i]='..') or (files[i]='.')) then begin
      files.Delete(i);
      i:=i-1;
    end else
      if directoryexists(sd+files[i]) then begin
        files.Delete(i);
        i:=i-1;
      end;
    inc(i);
  end;
  result:=e;
  sysutils.findclose(s);
end;

function gettreeindir(const root:string;var files,dirs:tstringlist;filter:string):extended;
var
  sd:string;
  i,j:integer;
  fls,unterverzeichnisse:tstringlist;
  flt:string;
  groesse:extended;
begin
  groesse:=0;
  if filter='' then
    flt:='*.*'
  else
    flt:=filter;
  sd:=dirup(root);
  files:=tstringlist.Create;
  dirs:=tstringlist.Create;
  dirs.Add(sd);
  i:=0;
  while i<dirs.Count do begin
    getdirsindir(dirs[i],unterverzeichnisse);
    for j:=0 to unterverzeichnisse.Count-1 do
      dirs.Add(dirup(dirs[i])+unterverzeichnisse.Strings[j]);
    inc(i);
  end;
  for i:=0 to dirs.Count-1 do begin
    groesse:=groesse+getfilesindir(dirs[i],flt,fls);
    for j:=0 to fls.Count-1 do
      files.Add(dirup(dirs[i])+fls.strings[j]);
  end;
  result:=groesse;
end;
dann mit forcedirectories Verzeichnisse erstellen und mit copyfile die Dateien kopieren.

Luckie 7. Mär 2006 22:51

Re: Ordner kopieren
 
Und warum ist das nicht gut? Guck mal, wa du da jetzt an Code produziert hast. Mit der API Funktion reduziert sich das auf 10 bis 15 Zeilen.

MathiasSimmack 8. Mär 2006 11:03

Re: Ordner kopieren
 
Zitat:

Zitat von ichbins
SHFileOperation is aber nicht so gut, weil es die Windows Shell als Zwischenstufe verwendet (wie der Explorer).

Ist doch okay. Die Ordner sollen wohl unter Windows kopiert werden, und den schicken Fortschrittsbalken bekommt man gratis dazu. :stupid: Warum soll ich mir die Mühe machen, wenn ich das Betriebssystem anzapfen kann?

Z32 8. Mär 2006 15:00

Re: Ordner kopieren
 
Danke für die Tipps bisher. Aber ich wäre auch lieber für 10 - 15 Zeilen als dieses Monster Programm. Da muss man sich erst mal zurechtfinden :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz