Dateien kopieren |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
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.
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);
sh.pTo := PChar(ADest + #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:
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:
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:
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.
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;
- Datei mit zugeordneter Anwendung öffnen
- Programm ohne sichtbares Fenster starten
- Größe einer Datei ermitteln
- Feststellen, ob eine Datei existiert
- Erstellungsdatum von Dateien ermitteln
- Letzten Dateizugriff ermitteln
- Ist eine Datei in Benutzung
- Dateiversion ermitteln
- Datei nach einem bestimmten String durchsuchen
- Anwendung ermitteln, die mit einer Dateiendung verknüpft ist