Bin etwas verwirrt gerade was dieses Thema angeht, also korrigiert mich wenn ich jetzt falsch liege.
Es soll doch Ordner X mit allen Unterordnern an einen neuen Ort kopiert werden (Durch beibehalten aller Dateinamen und (Unter-)Ordnernamen bleibt dann die Struktur auch erhalten, richtig?
In Lazarus mache ich das aktuell so (nicht vom Widestring irritieren lassen):
copydir(Source, Destination);
Delphi-Quellcode:
//Verzeichnis kopieren
function CopyDir(SourceDirectory: WideString; DestinationDirectory: WideString): boolean;
var
SHFileOpStruct: TSHFileOpStruct;
SourceBuffer, DestinationBuffer: array[0..255] of char;
res: integer;
begin
try
if not SysUtils.DirectoryExists(SourceDirectory) then
begin
Result := False;
exit;
end;
Fillchar(SHFileOpStruct, sizeof(SHFileOpStruct), 0);
FillChar(SourceBuffer, sizeof(SourceBuffer), 0);
FillChar(DestinationBuffer, sizeof(DestinationBuffer), 0);
StrPCopy(SourceBuffer, String(SourceDirectory));
StrPCopy(DestinationBuffer, String(DestinationDirectory));
with SHFileOpStruct do
begin
Wnd := 0;
wFunc := FO_COPY;
pFrom := @SourceBuffer;
pTo := @DestinationBuffer;
fFlags := FOF_ALLOWUNDO;
hNameMappings := nil;
lpszProgressTitle := nil;
fFlags := fFlags or FOF_NOCONFIRMATION;
fFlags := fFlags or FOF_SILENT;
fFlags := fFlags or FOF_SIMPLEPROGRESS;
fFlags := fFlags or FOF_NOCONFIRMMKDIR;
end;
res := SHFileOperation(SHFileOpStruct);
Result := (res = 0);
if not Result then
begin
ShowMessage(SysErrorMessage(GetLastError));
end;
except
Result := False;
end;
end;
Das funktioniert einwandfrei bisher.