Seite 1 von 1
Timing: muss warten, bis ein Verzeichnis gelöscht wurde.
Verfasst: 09.08.2019 20:04
von stab
Hallo zusammen,
eigentlich wollte ich mir ein kleines Werkzeug schreiben, hänge aber jetzt schon in den ersten Zeilen fest.
Wie kann ich das Programm solange anhalten, bis ein Verzeichnis so gelöscht wurde, damit es wieder neu erstellt werden kann? ( ohne Delay() natürlich)
Packe ich in das Verzeichnis ein paar Dateien rein, dauert der Löschvorgang zu lange und CreateDirectory() schlägt fehl.
Habe einiges versucht mit IsDirectory() Abfragen, while:wend, u.s.w., funktioniert bei mir aber nicht.
Ich bräuchte also die kugelsichere Funktion IsNotDirectory()

.
Code: Alles auswählen
meineTempDir$ = GetTemporaryDirectory() + "meineTempDir"
;falls Verzeichnis existiert, löschen
If ExamineDirectory(0, meineTempDir$, "*.*")
Ergebnis = DeleteDirectory(meineTempDir$, Pattern$ , #PB_FileSystem_Recursive | #PB_FileSystem_Force )
FinishDirectory(0)
EndIf
; Delay(2000) funktioniert, will ich aber nicht
; Verzeichnis wieder erstellen
If Not CreateDirectory(meineTempDir$)
MessageRequester("Sorry!", "Unerwartetes Programmende! Keine Schreibrechte!")
EndIf
End
Danke für Ideen
Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
Verfasst: 09.08.2019 20:40
von Nino
Folgendes funktionierte eben bei meinen Tests (unter Windows):
Code: Alles auswählen
EnableExplicit
Macro ExistDir(_path_)
Bool(FileSize(_path_) = -2)
EndMacro
Define meinTempDir$
meinTempDir$ = GetTemporaryDirectory() + "meinTempDir"
; falls Verzeichnis existiert, löschen
If ExistDir(meinTempDir$)
If DeleteDirectory(meinTempDir$, "", #PB_FileSystem_Recursive | #PB_FileSystem_Force)
While ExistDir(meinTempDir$)
Delay(1) ; Verarbeitung von Ereignissen ermöglichen
Wend
EndIf
EndIf
; Verzeichnis wieder erzeugen
If CreateDirectory(meinTempDir$) = 0
MessageRequester("Fehler", "Das Verzeichnis '" + meinTempDir$ + "' konnte nicht erzeugt werden.")
EndIf
Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
Verfasst: 09.08.2019 21:24
von stab
Hallo Nino,
danke, funktioniert super.
Wäre nie drauf gekommen, das so zu lösen.
Da zeigt sich Routine.
Wie immer, ... hier wird man geholfen !
Schönen Abend noch in Berlin ..
Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
Verfasst: 10.08.2019 21:22
von stab
So,
ich komme noch mal zurück auf mein Problem, das ich hatte.
(Gestern nur schnell den Code getestet und überlegt, warum Macro und Boolsche-Funktion.)
Wie gesagt, so löst man das als erfahrener Programmierer.
Für mich als Hobby-Purebasicer ist die entscheidene "kugelsichere" Funktion hier ja FileSize(Directory$), die -2 bei vorhandensein eines Verzeichnisses zurückgibt. Danke noch mal für den Tipp, Nino!
Ich würde es also weiterhin so lösen:
Code: Alles auswählen
meineTempDir$ = GetTemporaryDirectory() + "meineTempDir"
;falls Verzeichnis existiert, löschen
If ExamineDirectory(0, meineTempDir$, "*.*")
Ergebnis = DeleteDirectory(meineTempDir$, Pattern$ , #PB_FileSystem_Recursive | #PB_FileSystem_Force )
FinishDirectory(0)
EndIf
While FileSize(meineTempDir$) = -2
Delay(1) ; Verarbeitung von Ereignissen ermöglichen
Wend
; Verzeichnis wieder erstellen
If Not CreateDirectory(meineTempDir$)
MessageRequester("Sorry!", "Unerwartetes Programmende! Keine Schreibrechte!")
EndIf
End
VG
Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
Verfasst: 11.08.2019 01:37
von Nino
stab hat geschrieben:(Gestern nur schnell den Code getestet und überlegt, warum Macro und Boolsche-Funktion.)
Es ist nicht wichtig, hier ein Macro zu verwenden. Aber ich finde das verbessert die Lesbarkeit des Codes.
stab hat geschrieben:Danke noch mal für den Tipp, Nino!
Keine Ursache.
stab hat geschrieben:Ich würde es also weiterhin so lösen:
Code: Alles auswählen
meineTempDir$ = GetTemporaryDirectory() + "meineTempDir"
;falls Verzeichnis existiert, löschen
If ExamineDirectory(0, meineTempDir$, "*.*")
Ergebnis = DeleteDirectory(meineTempDir$, Pattern$ , #PB_FileSystem_Recursive | #PB_FileSystem_Force )
FinishDirectory(0)
EndIf
[...]
Ich weiß nicht ob es sinnvoll ist, FinishDirectory() auf ein Verzeichnis anzuwenden, das inzwischen gar nicht mehr existiert. Wenn, dann würde ich es so machen:
Code: Alles auswählen
If ExamineDirectory(0, meineTempDir$, "*.*")
FinishDirectory(0)
Ergebnis = DeleteDirectory(meineTempDir$, Pattern$, #PB_FileSystem_Recursive | #PB_FileSystem_Force)
EndIf
Aber warum überhaupt ExamineDirectory() verwenden, wenn man nur wissen will ob das Verzeichnis existiert? Die Verwendung von FileSize() scheint mir näher liegend und einfacher, so wie ich es oben gemacht habe.
Und folgendes
ist überflüssig, wenn bei der vorangegangenen Prüfung herauskam dass das betr. Verzeichnis nicht existiert. Wenn das Verzeichnis existiert ist dieser Code nur dann sinnvoll, wenn das Löschen des Verzeichnisses erfolgreich war, weil das sonst eine Endlosschleife ist. Deshalb habe ich diese Schleife in meinem vorigen Posting genau an diejenige Stelle im Code geschrieben, an der sie zu finden ist, und nicht woanders hin.
Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
Verfasst: 12.08.2019 19:06
von stab
Ich noch mal!
Eigentlich funktioniert ja jetzt alles und ich sollte mich um mein eigentliche Programm kümmern.
FinishDirectory(): Ich habe der Hilfe-Beschreibung entnommen, es soll nach ExamineDirectory() folgen, aber nicht weiter drüber nachgedacht.
Habe festgestellt, folgender Programm-Code funktioniert bestens:
Code: Alles auswählen
meineTempDir$ = GetTemporaryDirectory() + "meineTempDir"
;falls Verzeichnis existiert, löschen
While FileSize(meineTempDir$) = -2
DeleteDirectory(meineTempDir$, Pattern$ , #PB_FileSystem_Recursive | #PB_FileSystem_Force )
Wend
; Verzeichnis wieder erstellen
If Not CreateDirectory(meineTempDir$)
MessageRequester("Sorry!", "Unerwartetes Programmende! Keine Schreibrechte!")
EndIf
End
Danke und VG
Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
Verfasst: 12.08.2019 19:20
von mk-soft
Es ist besser ein Timeout mit einzubauen.
Wenn es nicht funktioniert das Verzeichnis zu löschen, bleibt dein Programm hängen.
Code: Alles auswählen
meineTempDir$ = GetTemporaryDirectory() + "meineTempDir"
Procedure ForceDeleteDirectory(Dir.s, Timeout = 5000)
Protected time
While FileSize(Dir) = -2
DeleteDirectory(Dir, "", #PB_FileSystem_Recursive | #PB_FileSystem_Force)
Delay(10)
time + 10
If time > Timeout
ProcedureReturn #False
EndIf
Wend
ProcedureReturn #True
EndProcedure
If Not ForceDeleteDirectory(meineTempDir$)
Debug "Error Delete Directory!"
End
EndIf
; Verzeichnis wieder erstellen
If Not CreateDirectory(meineTempDir$)
MessageRequester("Sorry!", "Unerwartetes Programmende! Keine Schreibrechte!")
EndIf
End
Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
Verfasst: 12.08.2019 21:00
von Nino
mk-soft hat geschrieben:Wenn es nicht funktioniert das Verzeichnis zu löschen, bleibt dein Programm hängen.
Auf dieses Risiko hatte ich ihn schon zuvor hingewiesen, aber er zieht es vor das zu ignorieren.
Um das Problem zu vermeiden, ist allerdings kein Timeout erforderlich. Entspr. Code hatte ich auch schon gepostet ...
Ich bin jetzt aus dieser Diskussion raus.
Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
Verfasst: 12.08.2019 21:18
von stab
Ja, stimmt.
Die Gefahr der Endlosschleife hattest Du schon erwähnt.
Danke auf jeden Fall für Eure Hilfe, Problem habe ich erkannt und komme jetzt weiter !!!
Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
Verfasst: 14.09.2019 10:59
von bin_neu_hier
Hallo allerseits,
dieses Thema interessiert mich auch und ich habe folgende Frage dazu:
Wenn ich das zu löschende Verzeichnis erst umbenenne, das Neue dann erzeuge und das Umbenannte dann irgendwann lösche, könnte es doch egal sein, wie lange der Löschvorgang dauert. Würde ein Umbenennen eines Verzeichnisses da einen Zeitgewinn bringen? Oder wenigstens kein "Abwarten" erforderlich machen?