Aktuelle Zeit: 14.08.2020 02:47

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Timing: muss warten, bis ein Verzeichnis gelöscht wurde.
BeitragVerfasst: 09.08.2019 20:04 
Offline
Benutzeravatar

Registriert: 24.02.2006 16:09
Wohnort: DE
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
BeitragVerfasst: 09.08.2019 20:40 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Folgendes funktionierte eben bei meinen Tests (unter Windows):

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

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
BeitragVerfasst: 09.08.2019 21:24 
Offline
Benutzeravatar

Registriert: 24.02.2006 16:09
Wohnort: DE
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
BeitragVerfasst: 10.08.2019 21:22 
Offline
Benutzeravatar

Registriert: 24.02.2006 16:09
Wohnort: DE
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
BeitragVerfasst: 11.08.2019 01:37 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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:
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:
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:
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.

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
BeitragVerfasst: 12.08.2019 19:06 
Offline
Benutzeravatar

Registriert: 24.02.2006 16:09
Wohnort: DE
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
BeitragVerfasst: 12.08.2019 19:20 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Es ist besser ein Timeout mit einzubauen.

Wenn es nicht funktioniert das Verzeichnis zu löschen, bleibt dein Programm hängen.
Code:
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 / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
BeitragVerfasst: 12.08.2019 21:00 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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.

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
BeitragVerfasst: 12.08.2019 21:18 
Offline
Benutzeravatar

Registriert: 24.02.2006 16:09
Wohnort: DE
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Timing: muss warten, bis ein Verzeichnis gelöscht wurde
BeitragVerfasst: 14.09.2019 10:59 
Offline

Registriert: 06.03.2019 21:52
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?

_________________
Der beste Fisch ist der Schnitzel


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 18 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye