Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi RmDir () liefert E/A-Fehler 32 nach findfirst-methode (https://www.delphipraxis.net/67021-rmdir-liefert-e-fehler-32-nach-findfirst-methode.html)

Hazardos 8. Apr 2006 00:08


RmDir () liefert E/A-Fehler 32 nach findfirst-methode
 
Hallo Leute,

um sich nur aufs wesentliche zu fokusieren abstrahiere ich mal mein Problem...

Ich habe ein Verzeichnis mit unterverzeichnissen mit FindFirst nach bestimmten Dateien durchsucht, diese gelöscht und zurück bleibt ein leerer Ordner, der nach der FindFirst-methode nicht mehr gelöscht werden kann ==> E/A-Fehler 32, welcher besagt, dass etwas zugriff auf diesen Ordner hat. Ist natürlich das Programm. Nur besteht der Zugriff seit der Suche bis zum Schließen des Programms, während der laufzeit kann der ordner also auch nicht via windows-explorer gelöscht werden.

Ich bin sicher dass es alternative methoden gibt, nur würde ich gerne wissen, warum selbst nach einem FindClose der Zugriff verweigert wird.

Wichtig ist nur:
FindFirst,FindNext,FindClose ==> RmDir () ==> E/A 32
Sollte der Quellcode trotzdem zur Problemlösung beitragen kann ich diesen natürlich auch hier reinstellen...

s.h.a.r.k 8. Apr 2006 01:11

Re: RmDir () liefert E/A-Fehler 32 nach findfirst-methode
 
Hey.

Post mal sicherheitshalber den Quellcode...

Sind vielleicht Dateiein im Ordner?! Hätte dir vielleicht ein Funktion, die ein Verzeichnis löscht. Habe ich im Easy Helper gefunden (von mir ungetestet!):

Zitat:

Die untenstehende Function löscht komplette Verzeicnhisse inkl. aller Unterverzeichnisse.

Als Parameter muss das zu löschende Verzeichnis übergeben werden, z.B.: 'C:\Test1\Verzeichnis'.

Die Function gibt True zurück, wenn das Verzeichnis erfolgreich gelöscht werden konnte, ansonsten erhälst du als Result False.

Delphi-Quellcode:
function DelDir(Dir : String) : Boolean;
var
 FileOption : TSHFileOpStruct;
begin
 ZeroMemory(@FileOption,SizeOf(FileOption));
 with FileOption do
 begin
   wFunc := FO_DELETE;
   fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
   pFrom := PChar(Dir + #0);
 end;
 Result := (ShFileOperation(FileOption) = 0);
end;
Die Funktion kann Beispielsweise so aufgerufen werden:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if DelDir('C:\Test\Verzeichnis') then
    Showmessage('Das Verzeichnis konnte gelöscht werden')
  else
    Showmessage('Das Verzeichnis konnte nicht gelöscht werden');
end;
Ausserdem muss die Unit ShellApi eingebunden werden.

Hazardos 8. Apr 2006 01:24

Re: RmDir () liefert E/A-Fehler 32 nach findfirst-methode
 
Erstmal danke für den Tip.

Das Löschen an sich ist allerdings nicht das Problem.
Das eigentliche Problem ist, dass die Suchmethode den Zugriff auf die Daten behält, also auch auf die leeren Ordner und das trotz FindClose und darüber hinaus auch bis zum Ende der Programmlaufzeit. Da muss erst der Zugriff aufgehoben werden ehe damit weitergearbeitet werden kann.

Brüggendiek 8. Apr 2006 02:27

Re: RmDir () liefert E/A-Fehler 32 nach findfirst-methode
 
Hallo Hazardos!

Versuche es doch einfach mal mit einem
Delphi-Quellcode:
SetCurrentDir (ExtractFilePath (ParamStr (0)));
nach dem FindClose. Vielleicht setzt FindFirst ja das aktuelle Verzeichnis - oder Du hast das selber (z.B. über einen Open/SaveDialog) gesetzt.

Du könntest ja auch mal eine Testanweisung einfügen, die Dir den Wert von "GetCurrentDir" z.B. in einer Messagebox ausgibt. Wenn das das zu löschende Verzeichnis ist, hast Du die Ursache gefunden.

Gruß

Dietmar Brüggendiek

r2c2 8. Apr 2006 08:59

Re: RmDir () liefert E/A-Fehler 32 nach findfirst-methode
 
Zitat:

Zitat von Brüggendiek
Versuche es doch einfach mal mit einem
Delphi-Quellcode:
SetCurrentDir (ExtractFilePath (ParamStr (0)));
nach dem FindClose. Vielleicht setzt FindFirst ja das aktuelle Verzeichnis - oder Du hast das selber (z.B. über einen Open/SaveDialog) gesetzt.

Wenns wirklich daran hängt, dann würd ich aber anders vorgehen. Und zwar sollte man auf relative Dateipfade ganz verzichten. Lieber ne - ausnahmsweise mal globale - Variable Path festlegen, in der ExtractFilePath(ParamStr(0)) steht...

Trotzdem: ich hab so das Gefühl, das hängt an was anderem... Zeig mal n bisschen mehr Code...

mfg

Chrisitain

Hazardos 8. Apr 2006 09:15

Re: RmDir () liefert E/A-Fehler 32 nach findfirst-methode
 
Code:
procedure tF_Backup.Entfernen (von,nach : String);
var Search : TSearchRec;
begin
von := IncludeTrailingBackslash(von);
nach := IncludeTrailingBackslash(nach);

 if FindFirst(nach+'*.*', faAnyFile, Search) = 0 then
   repeat
     if (not fileexists (von + Search.Name))
       and FileExists (nach + Search.Name)
         then deleteFile (nach + Search.Name);
   until FindNext (Search) <> 0;

 if FindFirst(nach+'*.*', fadirectory, Search) = 0
   then
     repeat
       if ((search.Attr and fadirectory) = fadirectory) and (Search.name[1] <> '.')
         then Entfernen (von+Search.Name+'\',nach + Search.Name + '\');
     until FindNext (Search) <> 0;

Findclose (Search);

if not DirectoryExists (von)
  then RmDir (nach);
end;
hier der vereinfachte Code...
er vergleicht 2 ordner auf den selben inhalt und passt den einen dem anderen an, sprich löscht, was nicht im einen vorhanden ist.

jetzt könnte man ja meinen, da die funktion rekursiv ist, dass die drüberliegende Funktion noch auf die Daten zugreift. Es funktioniert selbst dann nicht, wenn ich während der suche eine Liste erstelle und anschließend nach der suche diese liste durchgehe und jedes einzelne element lösche. Vor der Suche besteht kein Zugriff. Also kann es ja an nichts anderem liegen. Ich möchte allerdings nicht das ganze Programm neu starten müssen, nur damit ich wieder auf die daten zugreifen kann...

merkwürdig ist auch, dass die Dateien gelöscht werden können...
Ich habe getcurrentdir ausgeführt und das ergebnis "desktop" erhalten, welches in keinster Weise mit meinem Aufruf in Verbindung gebracht werden kann...

Hawkeye219 8. Apr 2006 10:39

Re: RmDir () liefert E/A-Fehler 32 nach findfirst-methode
 
Hallo Hazardos,

ich habe es nicht geprüft, aber kann es sein, daß jedes (erfolgreiche) FindFirst ein FindClose benötigt? Du schließt beide FindFirst-Aufrufe durch ein gemeinsames FindClose ab.

Gruß Hawkeye

Hazardos 8. Apr 2006 11:20

Re: RmDir () liefert E/A-Fehler 32 nach findfirst-methode
 
naja.. ist ja das selbe TSearchRec... aber ich probiers mal aus!

Hazardos 8. Apr 2006 11:29

Re: RmDir () liefert E/A-Fehler 32 nach findfirst-methode
 
Hey genau DAS war der Fehler... !!!!!!
Ein herzliches Dankeschön an alle die sich mit meinem Problem befasst und mir somit weitergeholfen haben!

MfG Jörn


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz