Delphi-Quellcode:
.
.
function CopyDir(DirFrom, DirTo: string; Flags : integer = 0; bErrorHandler : boolean = True) : integer;
var
shellinfo: TSHFileOpStruct;
FromBuf, ToBuf : Array [0..255] of char;
begin
If Not DirectoryExists(DirTo) Then
begin
Result := -1;
Exit;
end;
Fillchar(shellinfo, Sizeof(shellinfo), 0 );
FillChar(FromBuf, Sizeof(FromBuf), 0 );
FillChar(ToBuf, Sizeof(ToBuf), 0 );
StrPCopy(FromBuf, DirFrom);
StrPCopy(ToBuf, DirTo);
with shellinfo do
begin
Wnd := 0;
wFunc := FO_COPY;
pFrom := @FromBuf;
pTo := @ToBuf;
fFlags := FOF_SIMPLEPROGRESS or
FOF_NOCONFIRMATION;
end;
Repeat
try
Result := SHFileOperation(shellinfo);
SHFreeNameMappings(Cardinal(shellinfo.hNameMappings));
except
Result := GetLastError;
end;
if Not bErrorHandler then Exit;
if Result <> 0 then
begin
if MessageDlg(Format('Das Verzeichnis'#13#10#13#10
+ '''%s'''#13#10#13#10
+ 'kann nicht nach'#13#10#13#10
+ '''%s'''#13#10#13#10
+ 'kopiert werden.'#13#10#13#10
+ 'Grund: %s'#13#10#13#10
+ 'Soll der Vorgang erneut versucht werden ?'#13#10#13#10
+ 'Wenn Sie ''Abbrechen'' drücken, muss das Verzeichnis'#13#10
+ 'oder die Dateien manuell kopiert werden !', [DirFrom, DirTo, GetFormatErrorMessage(Result)]),
mtWarning, [mbAbort, mbRetry], -1) <> mrRetry then
break;
end;
until Result = 0;
end;
.
.
Usage:
.
.
CopyDir(IncludeTrailingPathDelimiter(GetCurrentDir) + DIRDATA + '\Dokumentation\*', sTemp);
.
.
Die Funktion
CopyDir wird im Programm an verschieden Stellen verwendet. Beim Kopiervorgang eines größeren Verzeichnisses (ca. 6,5 MB in 162 Dateien) löst
SHFileOperation hin und wieder eine
Exception aus. Entweder Fehler 7 (The storage control blocks were destroyed) oder der Thread in dem der Vorgang abläuft stürzt ganz ab ohne einfangen der
Exception. Alleine das wundert mich schon, da ein try .. except Block um die Funktion gebaut ist.
http://bugtrack.sporleder.de/image/installer_7.GIF
Weiß jemand Rat ? Googlen hat mir jedenfalls nicht geholfen