Entwickler-Ecke

Dateizugriff - RemoveDir löscht nicht immer ein leeres Verzeichnis


schitho - So 05.03.06 23:07
Titel: RemoveDir löscht nicht immer ein leeres Verzeichnis
Hi,

RemoveDir sollte ja ein leeres Verzeichnis löschen. Tut es aber scheinbar nicht immer.

Ich meinem Programm durchsuche ich ein Verzeichnis, überschreiben alle Dateien, benenne die um und zum Schluß lösche ich diese Dateien. Danach wird das nun leere Verzeichnis umbenannt und mit RemoveDir gelöscht:


Delphi-Quelltext
1:
2:
3:
  AssignFile(f,szPath);
  Rename(f,newDirName);
  Result:=RemoveDir(newDirName);


Das Löschen des Verzeichnisses scheitert aber immer wieder, aber nicht immer. Nur wenn ich ein Sleep dazwischen gebe funktioniert es:


Delphi-Quelltext
1:
2:
3:
4:
  AssignFile(f,szPath);
  Rename(f,newDirName);
  sleep(10);
  Result:=RemoveDir(newDirName);


Scheinbar braucht Windows etwas Zeit, um festzstellen, dass das Verzeichnis schon leer ist. Oder kann es an etwas anderem liegen?

Gibt es eine Möglichkeit, wie ist das Problem eleganter (als mit Sleep) umgehe?

Danke

Gruß
Thomas


digi_c - Mo 06.03.06 14:55

Ist bei rmdirdas selbe Problem? Was meint in diesem Fall IOResult?


schitho - Di 07.03.06 00:23

user profile icondigi_c hat folgendes geschrieben:
Ist bei rmdirdas selbe Problem? Was meint in diesem Fall IOResult?


Der gleiche Fehler. IOResult liefert den Fehlercode 32 (=Verletzung bei der gemeinsamen Benutzung).

Wobei der Fehler nicht immer auftritt.

Wenn ich wieder Sleep dazwischen gebe, dann funktioniert es. Dabei genügt scheinbar bereit ein Sleep(1) :?!?:


Seltsam.

Wie kann ich das Problem lösen?

Gruß
Thomas


jasocul - Di 07.03.06 08:43

Vermutlich ist das Betriebssystem noch nicht mit Umbenennen fertig, wenn du es löschen willst.


schitho - Di 07.03.06 22:09

user profile iconjasocul hat folgendes geschrieben:
Vermutlich ist das Betriebssystem noch nicht mit Umbenennen fertig, wenn du es löschen willst.


Das vermute ich auch! Ich werde wahrscheinlich ein Schleife einbauen, die eine bestimmte Zeit das Löschen probiert. Nur wenn es erst nach einiger Zeit nicht funktioniert, dann werde ich eine Fehlermeldung ausgeben.

Die Lösung mit Sleep erscheint mir doch recht unsicher, weil es wohl auch vom PC abhängen wird, wie schnell das Betriebssystem zum Löschen bereit ist.

Oder habt Ihr eine bessere Lösung?

Gruß
Thomas


drstar - So 19.03.06 11:27
Titel: Re: RemoveDir löscht nicht immer ein leeres Verzeichnis
user profile iconschitho hat folgendes geschrieben:
Hi,
...

Delphi-Quelltext
1:
2:
3:
  AssignFile(f,szPath);
  Rename(f,newDirName);
  Result:=RemoveDir(newDirName);

...


Nur mal ne Frage: Wo löschst Du die Datei? Ich seh nur, daß ne Datei umbenannt wird und ein (dann wohl nicht leeres) Verzeichnis gelöscht werden soll, und daß dürfte dann ein wenig schwierig werden. Ansonsten könnte es auch daran liegen, daß der Dateiname und der Ordnername gleich sind, und das hat schon mal unter Windows ME unlustiges ergeben, möglicherweise würde es also helfen, Datei- und Ordnernamen verschieden zu wählen.


MSCH - So 19.03.06 11:34

kipp ein Application.ProcessMessages dazwischen.

Windows ist doch nachrichtenbasierend. Die Shell also auch und wenn sie keine "Zeit" bekommt,
auf änderungen im Filesystem zu reagieren, kommt es zu gezeigten "Ungereimtheiten".

grez
msch


schitho - So 19.03.06 21:57
Titel: Re: RemoveDir löscht nicht immer ein leeres Verzeichnis
user profile icondrstar hat folgendes geschrieben:
user profile iconschitho hat folgendes geschrieben:
Hi,
...

Delphi-Quelltext
1:
2:
3:
  AssignFile(f,szPath);
  Rename(f,newDirName);
  Result:=RemoveDir(newDirName);

...


Nur mal ne Frage: Wo löschst Du die Datei? Ich seh nur, daß ne Datei umbenannt wird und ein (dann wohl nicht leeres) Verzeichnis gelöscht werden soll, und daß dürfte dann ein wenig schwierig werden. Ansonsten könnte es auch daran liegen, daß der Dateiname und der Ordnername gleich sind, und das hat schon mal unter Windows ME unlustiges ergeben, möglicherweise würde es also helfen, Datei- und Ordnernamen verschieden zu wählen.


Die Dateien lösche ich natürlich vorher. Das Verzeichnis ist also definitiv leer.

user profile iconMSCH hat folgendes geschrieben:

kipp ein Application.ProcessMessages dazwischen.

Windows ist doch nachrichtenbasierend. Die Shell also auch und wenn sie keine "Zeit" bekommt,
auf änderungen im Filesystem zu reagieren, kommt es zu gezeigten "Ungereimtheiten".

grez
msch


Danke für den Tipp! Das werde ich ausprobieren.

Gruß
Thomas