Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

SHFileOperation Error 1026

  Alt 23. Okt 2005, 20:36
Moin,

ich hab'n winziges Problem mit SHFileOperation und zwar werden nicht alle Dateien gelöscht.
Es werden nicht alle Dateien gelöscht.
Oder besser ausgedrückt, der erste Aufruf (wo alles auf einmal übergeben wird) löscht nichts und beim zweiten Durchlauf (wo jede Datei einzeln behandelt wird) weden nur einige Dateien gelöscht und einige bleiben mit der selben Fehlermeldung ungelöscht.

Die übergebenen Dateien existieren und mit den Zugriffsrechten sollte alles OK sein.
Auch geöffnet sind die entsprechenden Dateien nicht.

Als Rückgabewert kommt immer $402 (1026) zurück.
und, wenn die Fehlereldung nicht unterdrückt wird, auch folgendes.
Zitat:
---------------------------
Fehler beim Verschieben der Datei oder des Ordners
---------------------------
Datei kann nicht verschoben werden: Die Quelldatei oder vom Quelldatenträger kann nicht gelesen werden.
---------------------------
OK
---------------------------
Weiß zufällig jemand was dieser Fehler genau bedeuten soll?
Ach ja, ich hab natürlich versucht mal einige der betroffenen Dateien zu öffenen und Notepad hat jedenfalls keine Probleme



Beim Aufruf, den Parametern und den Dateinamen sollte es allerdings keine Probleme geben.

Wenn es interessiert, die Funktion sieht so aus und in der Wide-Variante wird es noch mit der langsamen Strings gemacht ... dort sollte leichter erkennbar sein was gemacht wird.
Delphi-Quellcode:
    Function DeleteToRecycler(Const FileNames: TDynAnsiStringArray): ByteBool;
      Var P: PAnsiChar;
        i, i2: Integer;
        ShellInfo: TSHFileOpStructA;

      Begin
        Result := False;
        P := nil;
        Try
          i := 0;
          For i2 := High(FileNames) downto 0 do If FileNames[i2] <> 'Then Inc(i, Length(FileNames[i2]) + 1);
          If i = 0 Then Exit;
          P := Memory.Get(i + 2);
          (P + i)^ := #0;
          (P + i + 1)^ := #0;
          For i2 := High(FileNames) downto 0 do If FileNames[i2] <> 'Then Begin
            Dec(i, Length(FileNames[i2]) + 1);
            Memory.Copy(Pointer(FileNames[i2]), P + i, Length(FileNames[i2]) + 1);
          End;
          Memory.Zero(@ShellInfo, SizeOf(TSHFileOpStructA));
          ShellInfo.Func := foDelete;
          ShellInfo.opFrom := P;
          ShellInfo.Flags := fofNoConfirmation or fofAllowUndo or fofNoErrorUI;
          Result := SHFileOperationA(ShellInfo) = S_OK;
        Finally
          Memory.Free(Pointer(P));
        End;
        If not Result Then Begin
          Result := True;
          For i := High(FileNames) downto 0 do Begin
            Memory.Zero(@ShellInfo, SizeOf(TSHFileOpStructA));
            ShellInfo.Func := foDelete;
            ShellInfo.opFrom := Pointer(FileNames[i]);
            ShellInfo.Flags := fofNoConfirmation or fofAllowUndo or fofNoErrorUI;
            If SHFileOperationA(ShellInfo) <> S_OK Then Result := False;
          End;
        End;
      End;

    Function DeleteToRecycler(Const FileNames: TDynWideStringArray): ByteBool;
      Var S: WideString;
        i: Integer;
        ShellInfo: TSHFileOpStructW;

      Begin
        S := #0;
        For i := High(FileNames) downto 0 do If FileNames[i] <> 'Then S := FileNames[i] + #0 + S;
        If Length(S) <= 1 Then Begin Result := False; Exit; End;
        Memory.Zero(@ShellInfo, SizeOf(TSHFileOpStructW));
        ShellInfo.Func := foDelete;
        ShellInfo.opFrom := Pointer(S);
        ShellInfo.Flags := fofNoConfirmation or fofAllowUndo or fofNoErrorUI;
        Result := SHFileOperationW(ShellInfo) = S_OK;
        S := '';
        If not Result Then Begin
          Result := True;
          For i := High(FileNames) downto 0 do Begin
            Memory.Zero(@ShellInfo, SizeOf(TSHFileOpStructW));
            ShellInfo.Func := foDelete;
            ShellInfo.opFrom := Pointer(FileNames[i]);
            ShellInfo.Flags := fofNoConfirmation or fofAllowUndo or fofNoErrorUI;
            If SHFileOperationW(ShellInfo) <> S_OK Then Result := False;
          End;
        End;
      End;
$2B or not $2B
  Mit Zitat antworten Zitat