Autor Beitrag
schitho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: So 05.03.06 23:07 
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:

ausblenden 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:

ausblenden 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

_________________
(Sorry! Leider ewiger Delphi-Neuling)
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mo 06.03.06 14:55 
Ist bei rmdirdas selbe Problem? Was meint in diesem Fall IOResult?
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: 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

_________________
(Sorry! Leider ewiger Delphi-Neuling)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 07.03.06 08:43 
Vermutlich ist das Betriebssystem noch nicht mit Umbenennen fertig, wenn du es löschen willst.
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: 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

_________________
(Sorry! Leider ewiger Delphi-Neuling)
drstar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 79
Erhaltene Danke: 2

Windows 8.1/x64
Delphi 10.1
BeitragVerfasst: So 19.03.06 11:27 
user profile iconschitho hat folgendes geschrieben:
Hi,
...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: So 19.03.06 21:57 
user profile icondrstar hat folgendes geschrieben:
user profile iconschitho hat folgendes geschrieben:
Hi,
...
ausblenden 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

_________________
(Sorry! Leider ewiger Delphi-Neuling)