Einzelnen Beitrag anzeigen

Benutzerbild von Orakel-von-Delphi
Orakel-von-Delphi

Registriert seit: 27. Jan 2004
Ort: Mittelhessen
45 Beiträge
 
Delphi 2007 Professional
 
#1

SHFileOperation löst Exception aus ?!

  Alt 2. Jun 2005, 15:23
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
Michael
  Mit Zitat antworten Zitat