Datei geöffnet / Lesezugriff verwalten auf mehrere Clients

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Datei geöffnet / Lesezugriff verwalten auf mehrere Clients

    Hallo!

    Ich hätte mal wieder ein Problem, ja, mist, ich weiß..

    ..und zwar überwache ich mit nem FileWatcher eine Datei auf Veränderung.
    Wenn der FileWatcher feuert soll die Datei, die ein DataTable beinhaltet, auf mehreren Clients aktualisiert werden.

    D.H. die Datei wird von mehreren Clients verwendet um "gemeinsam" an einer Tabelle zu arbeiten.
    Wenn nun jemand einen Wert in der Tabelle hinzugefügt/verändert hat wird die DataTable in der Datei gespeichert..dann feuert bei jedem Client der Filewatcher!
    Aber wenn nun mehrere Clients gleichzeitig diese Datei auslesen möchten krachts auf Grund des Dateizugriffs und einer geöffneten Datei!

    Ich hab im Netz sowas gefunden wie:
    "WaitForFile"
    oder
    "IsFileInUse":
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function IsFileInUse(sFile As String) As Boolean
    2. Try
    3. Using f As New IO.FileStream(sFile, IO.FileMode.Open, IO.FileAccess.ReadWrite, IO.FileShare.None)
    4. End Using
    5. Catch Ex As Exception
    6. Return True
    7. End Try
    8. Return False
    9. End Function



    Wenn ich die Funktion aber in eine While Schleife packe hängt das gesamte Programm..auch wenn die "Clients" den Lesezugriff beendet haben..

    Gibts da iwas elegantes, oder wie könnte ich eine geregelte Verteilung der Datei realisieren?
    Notfalls eben den Post#1-Funktionsaufruf mit einem Async/Await kombinieren und ein wenig warten:

    VB.NET-Quellcode

    1. Private Async Sub ModifyFile(FilePath As String)
    2. Await Threading.Tasks.Task.Run(Sub WaitForFileAccess(FilePath))
    3. 'hier was immer Du mit der Datei auch machen willst.
    4. End Sub
    5. Private Sub WaitForFileAccess(FilePath As String)
    6. Do While IsFileInUse(FilePath)
    7. Threading.Thread.Sleep(1000)
    8. Loop
    9. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Und nur zur Sicherheit: Beim Lesen und Schreiben unter Verwendung von Streams darauf achten, dass diese auch per Usingblock oder Stream.Close geschlossen werden, sonst bleibt der Dateizugriff und die Datei gilt weiterhin als beschlagnahmt!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.