Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SHFileOperation Error 1026 (https://www.delphipraxis.net/55592-shfileoperation-error-1026-a.html)

himitsu 23. Okt 2005 19:36


SHFileOperation Error 1026
 
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 :gruebel:



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;

marabu 23. Okt 2005 22:10

Re: SHFileOperation Error 1026
 
Genügend Platz hast du auf dem volume, dessen recycle bin wachsen muss?

marabu

ripper8472 23. Okt 2005 23:20

Re: SHFileOperation Error 1026
 
am muelleimer kanns nicht liegen, die dateien werden ja nur dorthin verschoben, nicht kopiert.

hat irgendeine anwendung noch handles auf die dateien?

Luckie 23. Okt 2005 23:22

Re: SHFileOperation Error 1026
 
Das Öffnen könne mit Notepad hat nichst zu sagen. Wenn sie nicht exklusiv geöffnet ist, dann kannst du sie zwar ohne Probleme von einem anderen Prozess aus öffnen, aber löschen geht eben nicht, weil sie geöffnet ist. Geht denn das Löschen über den Explorer?

himitsu 24. Okt 2005 00:59

Re: SHFileOperation Error 1026
 
Also, ich weiß 100% das die Dateien nicht durch 'nen exclusieven zugriff gesperrt sein sollten.
Und ja, das Löschen über'n Explorer geht ohne Probleme.

Das ist ja mein Problem, ich sehe eigentlich keinen Grund warum die Dateien sich nicht löschen lassen.

Es handelt sich dabei um insgesamt ~300 Dateien in einem Verzeichnis mit Unterverzeichnissen und knapp die hälft läßt sich löschen und der Rest nicht.
Die Dateien sollten auch alle die selben Rechte haben, da sie alle von meinem Webspace stammen und zur selben Zeit runtergeladen wurden.


hmmm?
hab jetzt einiges gefunden, allerdings scheint da auch irgendwas nicht zu stimmen :shock:
mindestens 3 verschiedene Bedeutungen...

Quelldatei nicht vorhanden = Fehlercode 1026
http://www.vbarchiv.net/forum/read.php?f=14&i=889&t=889
Die Dateien existieren aber.

Dateien können nicht gelöscht/verschoben werden (Dateisystemfehler 1026)
http://www.wintotal.de/Tipps/Eintrag...ID=196&URBID=7
http://www.moonsault.de/forum/showthread/t-33270.html
Hab die Papierkörbe gelöscht ... keine Besserung

1026 Datensatz überschreitet die maximale Länge (Record larger than maximum size)
http://www.act-computer.de/ftp/daten...20NT%204_0.htm
OK, ich übergebe zwar 300 Dateien, allerdings tritt der Fehler ja auch bei einigen Dateien auf, selbst wenn ich diese einzeln übergeben :gruebel:

jim_raynor 24. Okt 2005 06:51

Re: SHFileOperation Error 1026
 
Weiß nicht ob es daran liegt, aber bei Win32 und CopyMemory gibt du zuerst das Ziel an und dann die Quelle. Wenn es bei Mem.Copy genauso ist, dann hast du dort etwas verdreht ...

marabu 24. Okt 2005 08:26

Re: SHFileOperation Error 1026
 
Zitat:

Zitat von ripper8472
am muelleimer kanns nicht liegen

Der Mülleimer wächst selbstverständlich auch, wenn eine DELETE Operation ausgeführt wird. Microsoft fordert übrigens mindestens 100MB Freispeicher-Reserver auf jedem Volume für ein sorgenfreies Arbeiten mit dem Dateisystem.

@himitsu: Gibt es Dateinamen, die unter keinen Umständen gelöscht werden können, obwohl du sie im Explorer löschen kannst? Könntest du einen solchen Namen hier nennen?

Freundliche Grüße vom marabu

himitsu 24. Okt 2005 19:50

Re: SHFileOperation Error 1026
 
@jim_raynor:
Das Memory ist mein privates Memory-Management-System und dafür sind die Parameter schon richtig angegeben (Source, Dest, Length = von, nach, wieviel)

Zitat:

Zitat von marabu
Der Mülleimer wächst selbstverständlich auch, wenn eine DELETE Operation ausgeführt wird. Microsoft fordert übrigens mindestens 100MB Freispeicher-Reserver auf jedem Volume für ein sorgenfreies Arbeiten mit dem Dateisystem.

7,5 GB sollten doch wohl noch ausreichend sein?
Und soviel sollte doch am Mülleimer nicht anwachsen können - die Dateien werden ja verschoben und das einzige was anwachsen sollte ist diese .DAT-Datei im Mülleimer.

Zitat:

Zitat von marabu
Gibt es Dateinamen, die unter keinen Umständen gelöscht werden können, obwohl du sie im Explorer löschen kannst? Könntest du einen solchen Namen hier nennen?

In diesem Fall sind es fast ausschließlich PHPs, HTMs und GIFs.

Also wie geagt, ich sehe keinen Grund warum die Dateien nicht gelöscht werden können.
Es wäre also auch mal gut zu wissen was der Fehler wirklich bedeutet, also was SHFileOperation hat?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 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