Gleichzeitiger Zugriff auf Datei bzw. Abwarten

HuBaer

Ensign
Registriert
Aug. 2006
Beiträge
177
Hallo allerseits,

folgendes Problem: Von meinem VisualBasic-Script laufen immerm mehrere Instanzen gleichzeitig. Das Problem ist jetzt, wenn beide zufällig zur selben Zeit in eine Logdatei schreiben wollen, dann erhält eine Instanz den Laufzeitfehler "Zugriff verweigert". Es muss also irgendwie gehen, dass die eine Instanz wartet bis die andere fertig ist oder beide auf die datei gleichzeitig zugreifen können?!

Gruß
Christoph
 
Ich kenn mich VBS zu wenig aus. Aber es sollte doch möglich sein, dass Du vorher abfragst, wenn die Datei bereits offen ist. Dann machst Du ein Loop, der solange läuft bis die Datei wieder zu ist und dann schreibt, wenn die dann wieder verfügbar ist (obschon das natürlich in die Hose gehen kann, wenn die aus irgendeinem Grund nie zugeht ;) ) Aber halt sowas in der art...
 
Du kannst VOR dem Zugriff auf die Logdatei eine leeres Lock-File erstellen und beim Schliessen der Logdatei killst du das Lock-File wieder. Nun greifst du nur auf die Logdatei zu, wenn das Lock-File nicht vorhanden ist, sprich du programmierst einen Wait bis das Lock-File weg ist und greifst dann auf die Logdatei zu.
 
Die Idee mit dem Lockfile hab ich jetzt umgesetzt und es funktioniert auch wunderbar. Aber nehmen wir mal folgendes an: Die Instanz, welche die Datei geöffnet hat, stürzt noch vor dem Schließen der Datei ab oder bleibt sonstwie hängen. Jetzt ist dann praktisch die Datei dauerhaft offen. Nun könnte ich neben dem Lockfile noch ein Zeitlimit einbauen, nach dem der Dateizugriff einfach übersprungen wird. Das wäre immer noch besser, als wenn das Programm in der Do-Schleife gefangen ist. Aber wenn das Programm unbedingt die Datei braucht, kann sie diese nicht irgendwie "mit Gewalt" öffnen oder vorher kopieren oder irgendwas?

Gruß
 
schreibt doch einfach in die lock-datei die pid (oder wie die prozessnummer unter windows heißt...) deines prozesses rein und schau dann, ob der entsprechende prozess noch lebt. wenn nicht, ist die lock-datei hinfällig.
mit einem verfallszeitraum wäre ich eher vorsichtig, da man den eigentlich nur falsch wählen kann.
 
HuBaer schrieb:
Die Idee mit dem Lockfile hab ich jetzt umgesetzt und es funktioniert auch wunderbar. Aber nehmen wir mal folgendes an: Die Instanz, welche die Datei geöffnet hat, stürzt noch vor dem Schließen der Datei ab oder bleibt sonstwie hängen. Jetzt ist dann praktisch die Datei dauerhaft offen. Nun könnte ich neben dem Lockfile noch ein Zeitlimit einbauen, nach dem der Dateizugriff einfach übersprungen wird. Das wäre immer noch besser, als wenn das Programm in der Do-Schleife gefangen ist. Aber wenn das Programm unbedingt die Datei braucht, kann sie diese nicht irgendwie "mit Gewalt" öffnen oder vorher kopieren oder irgendwas?

Gruß

Die Sache mit dem Lockfile funktioniert leider doch nicht wunderbar ;-) Ich habe damals folgende Codezeilen erstellt:

Code:
if fkt_dateizugriff("D:\lock_log.dat") = 0 then
  ...Schreibe in Logdatei...
fso.GetFile("D:\lock_log.dat").delete 

function fkt_dateizugriff(dateipfad)
  fkt_dateizugriff = 0
  Do While fso.FileExists(dateipfad)
    if zaehler = 20 then
      fkt_dateizugriff = 1
      exit do
    end if
    zaehler = zaehler + 1
    wscript.sleep 100
  Loop
  If fkt_dateizugriff = 0 then
    set datei_lockfile = fso.opentextfile(dateipfad,8, true, 0)
    datei_lockfile.close
  end if
End function

Die Funktion wartet (max. 2 Sek.) bis die Lockdatei nicht mehr existiert, erstellt diese dann und beendet. Gelöscht wird die Lockdatei dann außerhalb der Funktion nach dem Schreibvorgang.
Das Problem ist jetzt, dass nicht selten zwei Instanzen so "synchron" laufen, dass sie gleichzeitig das lockfile erstellen wollen. Eine Instanz bricht dann wieder mit einem Laufzeitfehler ab.

Noch ein einfacheres Beispiel:

Code:
if fso.FileExists("D:\lock_Test.dat") then fso.GetFile("D:\lock_Test.dat").delete

Auch hier bekomme ich ab und zu den Laufzeitfehler "Datei nicht gefunden", obwohl kurz davor noch die Existenz überprüft wird. Ich denke ihr erkennt die Problematik... Aber ich bin leider mit meinem Latein am Ende...darum wäre ich über Hilfe sehr dankbar!


Gruß
Christoph
 
Zuletzt bearbeitet:
Zurück
Oben