AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

SHFileOperation Error 1026

Ein Thema von himitsu · begonnen am 23. Okt 2005 · letzter Beitrag vom 24. Okt 2005
 
Benutzerbild von himitsu
himitsu
Online

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

SHFileOperation Error 1026

  Alt 23. Okt 2005, 19: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;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz