Home » Tipps & Tricks » Dateien/Verzeichnisse » Dateioperationen » Dateien kopieren

Dateien kopieren

Es gibt mehrere Möglichkeiten, Dateien zu kopieren. Die untenstehende Funktion kapselt den Win-API-Aufruf der Funktion ShFileOperation. Es muss die Unit ShellApi eingebunden werden.

uses
ShellApi;

function CopyFileEx(const ASource, ADest: string;
ARenameCheck: boolean = false): boolean;
var
  sh: TSHFileOpStruct;
begin
  sh.Wnd := Application.Handle;
  sh.wFunc := FO_COPY;

  // String muss mit #0#0 terminiert werden, um das Listenende zu setzen
  sh.pFrom := PChar(ASource + #0#0);
  sh.pTo := PChar(ADest + #0#0);
  sh.fFlags := fof_Silent or fof_MultiDestFiles;
  if ARenameCheck then
    sh.fFlags := sh.fFlags or fof_RenameOnCollision;
  Result:=ShFileOperation(sh)=0;
end;

Durch den Parameter fFlags kann das Verhalten der Funktion beeinflusst werden. Da hier der Wert FoF_Silent gesetzt wird, erscheint kein Fortschrittsbalken. Die möglichen Parameter für fFlags, mit denen Sie das Verhalten der Funktion beeinflussen können, kann man im PSDK unter dem Stichwort SHFILEOPSTRUCT finden.

Als Parameter werden die alten und die neuen Dateinamen erwartet. Der optionaler Parameter gibt an, ob mögliche Kollisionen mit bereits vorhandenen Dateinamen behandelt werden sollen. Wird dem Parameter False übergeben, wird der Anwender gefragt, bevor eine Datei überschrieben wird. Steht der Parameter auf True wird die Datei automatisch umbenannt.

Schlägt die Funktion fehl, wird False zurückgegeben.
Sollen mehrere Dateien kopiert werden, müssen die einzelnen Dateinamen mit einem #0 getrennt werden:

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyFileEx('c:\datei1.txt' + #0 + 'c:\datei2.txt', 'c:\datei1.neu.txt' + #0 + 'c:\datei2.neu.txt');
end;

Auf diese Weise können auch komplette Verzeichnisse kopiert werden. Auch unterstützt der ASource-Parameter Wildcards. Folgender Aufruf würde alle Dateien mit der Endung „.txt“ und das Verzeichnis „C:\neu“ kopieren:

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyFileEx('C:\alt*.txt','C:\neu');
end;

Mit der Funktion CopyFile hat der Programmierer eine weitere Möglichkeit zum Kopieren von Dateien. Mit ihr lassen sich nur einzelne Dateien kopieren. Als erste Parameter wird der Pfad zur existierenden Datei erwartet, dem zweiten wird der neue Dateiname übergeben. Soll eine evtl. vorhandene Datei überschrieben werden, muss dem dritten Parameter False übergeben werden:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if CopyFile(PChar('C:\Datei.txt'), PChar('C:\Datei.neu.txt'), False) then
   Showmessage('Datei wurde kopiert')
  else
   RaiselastOSError;
end;

RaiseLastOSError ist erst ab Delphi 6 verfügbar. Programmierer, die mit älteren Versionen arbeiten, müssen an dieser Stelle RaiseLastWin32Error verwenden.

Alternative

Diese Routine kopiert eine Datei, indem sie sie in einen Stream lädt und an dem Zielort wieder abspeichert.

procedure TForm1.Button1Click(Sender: TObject);
var
  mem : TMemoryStream;
  FilePathA, FilePathB : string;
begin
  FilePathA := Edit1.Text; // Pfad der zu kopierenden Datei
  FilePathB := Edit2.Text; // Zielpfad
  mem := TMemoryStream.Create;
  try
    mem.LoadFromFile(filePathA);
    mem.SaveToFile(FilepathB);
  finally
    mem.Free;
  end;
end;