Datei gegen Zugriff von anderer Seite sperren

  • Ich habe zwei Programme, die auf die gleiche Datei zugreifen.Wenn das eine Programm die Datei geöffnet hat, soll das andere Programm, wenn es die Datei öffnen will, so lange warten bis das erste die Datei wieder geschlossen hat.FileOpen leistet das nicht.Wenn ich z. B. dieses Programm zweimal starte, können beide ungehindert mit der Datei parallel arbeiten.

    Code
    $h=FileOpen("Text.txt",2)
    MsgBox(0,"","offen")
    FileWriteLine($h,"yyy")
    MsgBox(0,"","geschrieben")
    FileClose($h)
    MsgBox(0,"","geschlossen")

    Was tun?

    • Offizieller Beitrag

    Man kann mit einer "Semaphoren"-Datei arbeiten.
    Programm 1 erstellt eine Datei (z.B. access.bin) und öffnet danach die eigentliche Textdatei, nimmt die Änderungen vor, schließt die Textdatei und löscht anschließend die "access.bin".
    Wenn nun Programm 2 auf die Textdatei zugreifen will, dann prüft es erst, ob "access.bin" existiert, wenn ja, dann solange warten, bis "access.bin" von Programm 1 wieder gelöscht wurde.
    Anschließend kann dann Programm 2 wie beschrieben auf die Textdatei zugreifen.

    Edit: Hier mal ein Testscript:

  • Du könntest auch einfach ein Fileattribut setzen, welche(s) ist erstmal egal. https://autoit.de/onlinehilfe/functions/FileSetAttrib.htm
    Die Programme dürfen nur auf die Datei zugreifen, wenn das "Hidden"-Flag nicht gesetzt ist.
    Ist das "Hidden"-Flag gesetzt, wird vom ersten Programm, welches diesen Zustand bemerkt, das Hidden-Flag gesetzt ("Leseschutz eingeschaltet") und die Datei gelesen. Danach wird das Flag wieder zurückgesetzt.

  • Wenn es wirklich den Zugriff von allen Seiten blockieren soll dann müsstest du direkt die Windows-Funktionen nutzen.
    Hier mal ein Beispiel wie man eine Datei exklusiv öffnen kann:

    Dort kannst du dann aber mit den AutoIt-Funktionen zum lesen und schreiben nicht weiter sondern musst die entsprechenden _WinAPI_XXX-Funktionen nutzen (fürs lesen ist ein Beispiel enthalten).

  • Recht vielen Dank für Eure Antworten.
    Ich muss sie mir nun erst einmal zu Gemüte ziehen.
    Der Vorschlag von Oscar erscheint mir insofern problematisch, dass wenn das Programm aus irgendeinem Grund abbricht bevor die Semaphorendatei geschlossen wird, dann bleibt sie "hängen" und blockiert alles weitere. Es kommt dann zwar
    MsgBox(0, 'Timeout', 'Zugriff verweigert'). Aber schön ist das auch nicht.
    Gruß Dieter

  • Der Vorschlag von Oscar erscheint mir insofern problematisch, dass wenn das Programm aus irgendeinem Grund abbricht bevor die Semaphorendatei geschlossen wird, dann bleibt sie "hängen" und blockiert alles weitere.

    Schau dir mal "OnAutoItExitRegister" an ;)

  • OnAutoItExitRegister ist ja eine prima Funktion. Die ist mir bisher noch nicht über den Weg gelaufen. Bzw. habe ich sie beim Durcharbeiten der AutoIt-Hilfe nicht im Kopf behalten.
    Jetzt habe ich mehrere Lösungsmöglichkeiten und die Qual der Wahl.
    Vielen Dank Euch allen.

    Einmal editiert, zuletzt von DOheim (9. Juli 2016 um 10:24)

  • Das sollte hiermit doch auch gehen...

    #include <WinAPIFiles.au3>

    ; Locks the specified file for exclusive access by the calling process
    _WinAPI_LockFile ( $hFile, $iOffset, $iLength )

    ; Unlocks a region in an open file
    _WinAPI_UnlockFile ( $hFile, $iOffset, $iLength )