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, Ordner löschen (https://www.delphipraxis.net/62541-shfileoperation-ordner-loeschen.html)

Chester 6. Feb 2006 08:50


SHFileOperation, Ordner löschen
 
Hi @ all!


Ich hab ein Problem beim löschen eines Ordners.

Wenn ich mit SHFileOperation einen Ordner löschen will, dann kommt der Fehler

Der Ordner 'NAME' kann nicht entfernt werden: Eine Zugriffsverletzung ist aufgetreten!
Die Quell- oder Zieldatei ist möglicherweise geöffnet!



Da ich diesen Ordner nicht geöffnet habe weiss ich nicht was ich falsch mache??!!


Der Quelltext schaut so aus:

Delphi-Quellcode:
for X := 0 to Liste.Count -1 do begin
  if FileExists(Liste.Strings[x]) then begin
    with shellinfo do begin
      wnd := Application.Handle;
      wfunc := FO_DELETE;
      pFrom := PChar(Liste.Strings[x] + #0);
      pTo := nil;
    end; // End With
    SHFileOperation(shellinfo);
  end; // End If
end; // End For

marabu 6. Feb 2006 10:07

Re: SHFileOperation, Ordner löschen
 
Hi Chester,

nicht du hast den Ordner geöffnet, sondern der Windows Explorer sperrt ihn - nachdem du mindestens eine Datei daraus gelöscht hast. Du verwendest übrigens gar keine Flags. Die Löschfunktionalität habe ich so gekapselt:

Delphi-Quellcode:
// uses ShellApi;

function ShellDelete(const fsoName: string): Integer;
var
  sh: SHFileOpStruct;
  iResult: Integer;
begin
  ZeroMemory(@sh, sizeof(sh));
  with sh do
  begin
    wFunc := fo_Delete;
    pFrom := PChar(fsoName + #0);
    fFlags := fof_Silent or fof_NoConfirmation or fof_NoErrorUI;
  end;
  Result := SHFileOperation(sh);
end;
Bei dir wäre zu überlegen, ob du nicht alle Dateien mit einem Aufruf löschst. Schneller ist das.

Grüße vom marabu

Chester 6. Feb 2006 10:32

Re: SHFileOperation, Ordner löschen
 
So löschts die Dateien im Ordner, aber nicht den Ordner.
Die Dateien lösch ich schon vorher, weil ich einige zuerst verschieben.


Wie soll ich das machen: Bei dir wäre zu überlegen, ob du nicht alle Dateien mit einem Aufruf löschst. Schneller ist das.

marabu 6. Feb 2006 11:39

Re: SHFileOperation, Ordner löschen
 
Wenn ich meiner Funktion den Namen eines Ordners übergebe, dann wird der gelöscht - mit allen enthaltenen Dateien und Unterordnern.

Wenn du zuerst Dateien in einem Ordner löschst oder verschiebst, dann sperrt der Explorer den Ordner - schon alleine wegen des in die Shell integrierten undo features. Verschiebe nicht, sondern kopiere die noch benötigten Dateien, dann sollte das Löschen des Ordners funktionieren.

Mehrere Dateiobjekte kannst du mit einem einzigen Aufruf löschen, indem du mehrere PChar-Strings übergibst, anstelle nur einen.

marabu


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