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;