AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi RmDir () liefert E/A-Fehler 32 nach findfirst-methode
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Hazardos · begonnen am 8. Apr 2006 · letzter Beitrag vom 8. Apr 2006
Antwort Antwort
Hazardos

Registriert seit: 8. Okt 2003
Ort: Alfeld
73 Beiträge
 
#1

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

  Alt 8. Apr 2006, 00:08
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...
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

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

  Alt 8. Apr 2006, 01:11
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Hazardos

Registriert seit: 8. Okt 2003
Ort: Alfeld
73 Beiträge
 
#3

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

  Alt 8. Apr 2006, 01:24
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.
  Mit Zitat antworten Zitat
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#4

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

  Alt 8. Apr 2006, 02:27
Hallo Hazardos!

Versuche es doch einfach mal mit einem
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
Dietmar Brüggendiek
Die 6 Probleme des Programmierers: 1. dauert das länger, als man 2. glaubt, 3. geht das nicht so, wie man sich das 4. schlau überlegt hat, und 5. sitzt der Fehler da, wo man ihn 6. zuletzt sucht
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#5

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

  Alt 8. Apr 2006, 08:59
Zitat von Brüggendiek:
Versuche es doch einfach mal mit einem
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Hazardos

Registriert seit: 8. Okt 2003
Ort: Alfeld
73 Beiträge
 
#6

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

  Alt 8. Apr 2006, 09:15
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...
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

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

  Alt 8. Apr 2006, 10:39
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
  Mit Zitat antworten Zitat
Hazardos

Registriert seit: 8. Okt 2003
Ort: Alfeld
73 Beiträge
 
#8

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

  Alt 8. Apr 2006, 11:20
naja.. ist ja das selbe TSearchRec... aber ich probiers mal aus!
  Mit Zitat antworten Zitat
Hazardos

Registriert seit: 8. Okt 2003
Ort: Alfeld
73 Beiträge
 
#9

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

  Alt 8. Apr 2006, 11:29
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:31 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