Timing: muss warten, bis ein Verzeichnis gelöscht wurde.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
stab
Beiträge: 92
Registriert: 24.02.2006 16:09
Computerausstattung: 286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Wohnort: Hardt
Kontaktdaten:

Timing: muss warten, bis ein Verzeichnis gelöscht wurde.

Beitrag 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
Paul sagt: "Max lügt."
Max sagt: "Otto lügt."
Otto sagt: "Max und Paul lügen."

Wer lügt hier wirklich und wer sagt die Wahrheit?

_________________________________________

286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde

Beitrag 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
Benutzeravatar
stab
Beiträge: 92
Registriert: 24.02.2006 16:09
Computerausstattung: 286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Wohnort: Hardt
Kontaktdaten:

Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde

Beitrag 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 ..
Paul sagt: "Max lügt."
Max sagt: "Otto lügt."
Otto sagt: "Max und Paul lügen."

Wer lügt hier wirklich und wer sagt die Wahrheit?

_________________________________________

286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Benutzeravatar
stab
Beiträge: 92
Registriert: 24.02.2006 16:09
Computerausstattung: 286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Wohnort: Hardt
Kontaktdaten:

Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde

Beitrag 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
Paul sagt: "Max lügt."
Max sagt: "Otto lügt."
Otto sagt: "Max und Paul lügen."

Wer lügt hier wirklich und wer sagt die Wahrheit?

_________________________________________

286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde

Beitrag 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

Code: Alles auswählen

While FileSize(meineTempDir$) = -2
  Delay(1)
Wend 
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.
Benutzeravatar
stab
Beiträge: 92
Registriert: 24.02.2006 16:09
Computerausstattung: 286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Wohnort: Hardt
Kontaktdaten:

Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde

Beitrag von stab »

Ich noch mal!

Eigentlich funktioniert ja jetzt alles und ich sollte mich um mein eigentliche Programm kümmern. :D

FinishDirectory(): Ich habe der Hilfe-Beschreibung entnommen, es soll nach ExamineDirectory() folgen, aber nicht weiter drüber nachgedacht. :D :D



Habe festgestellt, folgender Programm-Code funktioniert bestens: :D :D :D

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
Paul sagt: "Max lügt."
Max sagt: "Otto lügt."
Otto sagt: "Max und Paul lügen."

Wer lügt hier wirklich und wer sagt die Wahrheit?

_________________________________________

286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde

Beitrag 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.
Benutzeravatar
stab
Beiträge: 92
Registriert: 24.02.2006 16:09
Computerausstattung: 286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
Wohnort: Hardt
Kontaktdaten:

Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde

Beitrag 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 !!!
Paul sagt: "Max lügt."
Max sagt: "Otto lügt."
Otto sagt: "Max und Paul lügen."

Wer lügt hier wirklich und wer sagt die Wahrheit?

_________________________________________

286er Big Tower; 16MHz; 1MB Ram; 40MB Festplatte, 5 1/4" und 3 1/2" Diskettenlaufwerk; VGA Farbmonitor 14"; Windows 3.1; PureBasic 0.5
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde

Beitrag 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?
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Antworten