Liegt ein Filesystemwatcher auf einem Ordner?

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von elmsrock.

    Liegt ein Filesystemwatcher auf einem Ordner?

    Hallo!
    Ich kenne den Pfad eines Ordners und frage mich, ob ich nur mit dieser Information feststellen kann, ob bereits ein Filesytemwatcher drauf aufpasst.

    Thread ins richtige Forum verschoben ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    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.
    @elmsrock Was hindert Dich daran, einen weiteren FSW aufzusetzen?
    @Murdoc
    Möglicherweise wird tief im System eine CallBack-Prozedur eingetragen, so dass dann zu erkennen wäre, wenn der Pointer nicht NULL ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Erst mal Danke an alle!
    @rod: Es hindert mich nichts daran, einen weiteren FSW zu aktivieren. Mein Gedanke war nur folgender:
    Ich muss verhindern, dass mein Programm mehr als 1x startet wobei Häkchen bei Einzelinstanz nicht funktionieren würde, denn es soll auch festgestellt werden, ob das Programm evtl. in einem anderen VLan bereits aktiv ist.
    Möglichkeit 1: Das Programm schreibt in eine Datei auf einem Server den PC-Namen, auf dem es läuft. Problem: Wird unter Umständen nicht zurückgenommen (z.B. Stromausfall am Client, Netzwerkausfall im VLan von da zum Server).
    Möglichkeit 2: Gegenseitige Abfragen. Dabei habe ich verkackt. Wie frage ich per TCP ins gesamte Firmen-Netz eine evtl. bereits laufende Instanz meines Programms ob sie da ist? Broadcast bleibt am ersten Router hängen. Außerdem sind da meine Kenntnisse nicht unbedingt so, dass ich weiß, was ich tue.
    Möglichkeit 3: Da kam mir die Idee mit dem FSW, denn auf dem bestimmten Ordner watcht mit ziemlicher Sicherheit nur mein Programm und irgendwelche Explorer, was das nächste Problem gewesen wäre, nämlich festzustellen, ob mein Programm oder ein Explorer watcht.

    Da werde ich wohl noch mal Möglichkeit 1 in Betracht ziehen.
    Oder hat vielleicht jemand eine ganz andere Idee?

    elmsrock

    elmsrock schrieb:

    öglichkeit 1: Das Programm schreibt in eine Datei auf einem Server den PC-Namen, auf dem es läuft. Problem: Wird unter Umständen nicht zurückgenommen (z.B. Stromausfall am Client, Netzwerkausfall im VLan von da zum Server).
    Schreib doch da regelmäßig einen Heartbeat-Timestamp rein.
    Dann kannst du beim Überprüfen feststellen, wenn schon lange nichts mehr passiert ist.

    Dazu brauchst du sie nicht mal lesen, sondern kannst die ModificationTime der Datei überprüfen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    @elmsrock Wie weit entfernt ist denn dasd andere VLan?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die VLans sind ca. 20 Stück an der Zahl und alle in 5 nebeneinander stehenden Hallen direkt über Ciscos verbunden bzw. getrennt.
    Die Netzwerk-Adressen sind mir bekannt und direkt ansprechbar, könnten natürlich geändert oder ergänzt werden was dann im Programm wohl immer mit zu ändern oder irgendwie zu hinterlegen wäre.
    petaods heartbeat scheint mir der gangbarste Weg zu sein.
    Nichtsdestotrotz fände ich eine TCP-Lösung irgendwie eleganter, weil ohne Zeitfenster.

    Danke euch!
    Andere banale Idee:

    Da deine Anwendung wohl nur einmal laufen soll warum nicht einfach explizit diese Anwendung nur auf einen Server starten und fertig.
    So würde Sie laufen ohne das irgendjemand anderes sie starten müsste. Per Aufgabenplanung könntest du deine Anwendung auch mit Windows starten z.b.

    Wäre finde ich die bessere Lösung als das du da auf 40 Clients das Tool installierst und dann jeder Mitarbeiter immer schauen muss ob das ding woanders schon läuft.


    EDIT// Bei einem Kunden war sowas ähnliches auch der Fall, zig Mitarbeiter mussten schauen das ein Programm läuft das Lieferantendaten in ein Netzlaufwerk schrieb.
    Einfache Lösung war einfach das auf den Internen Server zu packen und zack verschwand der Aufwand der Mitarbeiter da überhaupt dran zu denken.
    Jetzt schaut man halt wenn man Lieferantendaten braucht ins Netzlaufwerk und hat alles parat.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Hi, hat mich jetzt selbst interessiert und ich hab folgendes gefunden....

    docs.microsoft.com/en-us/sysinternals/downloads/handle

    Ist ein Command-Line-Tool von Microsoft.

    Zum testen hab ich einen FileSystemWatcher auf dem Pfad "e:\test" und das Programm folgendermaßen aufgerufen....



    Der Output zeigt nun, dass mein Programm "WindowsFromsApp37.exe" den Ordner unter Beschlag hat. Man kann den Output des Programms auch in der eigenen Anwendung auslesen und beim Start eben prüfen...
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @elmsrock Wäre es möglich, auf einem Server einen TCP-Server als SingleInstance laufen zu lassen und auf den Einzel-PCs TCP-Clients, die sich anmelden und die erforderlichen Informationen bekommen?
    Das läuft dann so lange, wie die Verbindung besteht bzw. der Strom nicht ausgefallen ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @xChRoNiKx:
    Die Chause läuft bereits jede Viertelstunde auf dem Server. Dann werden von den Teststationen die Ergebnisdateien abgeholt, entsprechend ihrer Inhalte verschoben, diese Inhalte in eine MySql-DB geschrieben, die man dann über eine PHP-Seite gefiltert anschauen bzw. durchsuchen kann. Ganz ähnlich wie du dankenswerterweise vorgeschlagen hast.
    Es war nur zusätzlich intern eine Anwendung angefragt, bei der die gleichzeitige Ausführung vermieden werden muss.

    @SpaceyX:
    Gute Idee und danke, funktioniert aber leider nur lokal.

    Wenn ich z.B. von "MeinPC" aus auf die Freigabe "result" auf dem PC "Linie8-xRay" mit dem Programm "MeinFSW" einen FSW lege, so sehe ich auf meinem PC via
    handle64 result --> << 3A7C: File (RWD) \Device\Mup\Linie8-xRay\result >>,
    auf dem PC "Linie8-xRay" << System pid: 4 type: File 24C4: C:\Testsystem\Log\Results >>
    und auf anderen PCs gar nichts.
    Dass ich von meinem PC aus drauf bin wusste ich bei Programmstart schon und dann per psexec den "Linie8-xRay" abzufragen liefert mir immer nur "system", es sei denn, mein Programm oder ein anderes greift zufällig gerade auf "Linie8-xRay" lokal auf den zu überwachenden Ordner zu.
    Schade.

    @Rod:
    Das wäre quasi das Gleiche wie der heartbeat, nur besser. Wenn ich das mit dem TCP gebacken kriegte.
    Prinzipiell habe ich mich mit der heartbeat-Datei-Lösung angefreundet.

    Danke nochmal an alle.

    elmsrock schrieb:

    Wenn ich das mit dem TCP gebacken kriegte.
    Es ist durchaus sinnvoll, ein kleines TCP-Client-Server-Snippet vorrätig zu halten.
    Wir hatten mal ein Projekt, da haben mehrere Instanzen desselben Programms auf mehreren Rechnern miteinander kommuniziert. Eine von denen (die mit dem Monitor) war der Master, die Slaves wurden entsprechend bedient.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    elmsrock schrieb:

    Ich muss verhindern, dass mein Programm mehr als 1x startet
    Würde es für dieses Ziel nicht reichen, an einem zentralen Ort eine Textdatei per FileStream in Beschlag zu nehmen? Wenn das Programm beendet wird oder abschmiert, ist die Datei freigegeben, aber solange das Programm läuft, kann kein anderes Programm einen FileStream darauf aquirieren. Einfaches Testen (V)LAN-weit m.E. möglich. Damit stell ich in unserem LAN sicher, dass manch SingleInstance-bedürftige App nicht an nem anderen PC ein 2. Mal gestartet wird.
    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.