Laden...

FileSystemWatcher

Erstellt von BenP vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.025 Views
B
BenP Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren
FileSystemWatcher

Hallo zusammen,

ich habe für ein Softwareprojekt eine AutoImport-Schnittstelle realisiert, welche über den Filesystemwatcher ständig ein Verzeichnis überwacht. Wird eine Exportdatei eines Fremdsystems dort abgelegt, reicht der Watcher den Dateipfad an die API-Importroutine des empfangenden Systemes weiter.

Ich muss nun aber in einer zukünftigen Programmversion mehrere Verzeichnisse überwachen. Bisher bekommt der Watcher aus einer XML-Datei beim Dienststart das zu überwachende Verzeichnis und bestimmte Parameter mit.

Wie kann ich zukünftig mehrere Watcher laufen lassen und auch einzelne Instanzen für die Überwachung stoppen. Wie kann ich bestimmte Instanzen die zur Laufzeit erzeugt werden beeinflussen und auch neue Settings für eine bestimmte Instanz mitgeben?

Vielen Dank für eure Hilfe

Gruß Ben

2.298 Beiträge seit 2010
vor 13 Jahren

Nutze eine Klasse, welche die einzelnen FileSystemWatcher verwaltet.

Speichere alle FileSystemWatcher Konfigurationen in die selbe XML-Datei und deserialisiere sie in der Klasse, welche deine Watcher verwaltet. - Pro Konfiguration erstellst du nun einen Watcher und übergibst die jeweilige Version.

Das wäre zumindest meine Vorgehensweise.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

B
BenP Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

Hi inflames,

danke dir. Aber bei der von dir empfohlenen Vorgehensweise müsste ich doch schon genau wissen, wie viele Watcher ich haben möchte (zum Serialisieren), oder?

Ich möchte die Anzahl jedoch vollkommen dynamisch halten. Ausserdem wollte ich nicht das ganze Objekt serialisieren sondern möchte die Objekte zur Laufzeit erzeugen und nur die Settings aus einer XML-Datei holen.

Mein Problem ist letztendlich die Art und Weise, wie ich auf eine spezielle Objektinstanz zugreifen kann, die ich erst zur Laufzeit und nicht zur Entwurfszeit habe. Ich könnte die Objekte ja in einer List <T> speichern oder? Aber wie komme ich an genau eine spezielle Instanz ran?

Gruß

Ben

194 Beiträge seit 2006
vor 13 Jahren

Hallo

Also im Falle von List<T> sicher über den Index.

Gruss

Balaban_s

A
350 Beiträge seit 2010
vor 13 Jahren

inflames Lösung ist schon vollkommen ok :

Du hast eine gewisse Anzahl an FileSysWatchern in einer Collection die x beliebig Groß ist.
Denkbar wäre das ganze auch in einem Dictionary wo du als Key den jeweiligen Pfad hast und und und

Aber Achtung ! Ab einer gewissen Zahl , je nach System , kann es vorkommen das die Dinger nicht richtig reagieren. Je nach einkommenden Daten ist es nötig den Puffer für den FSW nach oben zu setzten.

699 Beiträge seit 2007
vor 13 Jahren

Beachte auch noch, das Du die Methoden, welche dann durch den FileSystemWatcher ausgelöst werden sollen, in einen eigenen Thread auslagerst ( ThreadPool), sonst kann es schnell passieren, das ein Engpass enstehen kann, wenn die Methode lange laufzeiten hat.
Was auch gut in diesem zusammenhang passt SyncQueue<T> - Eine praktische Jobqueue.

Ansonsten wurde schon alles gesagt, was du beachten solltest. Ganz besonders wichtig wird sein, das Du den Buffer höher stellst, wenn häufige und schnelle Änderungen zu erwarten sind.

Grüße Stephan

B
BenP Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

Super! Vielen Dank euch allen für eure Hilfe!

Und danke für die Info mit dem Buffer. Habe auch schon gelesen, dass die Watcher ab einer gewissen Anzahl manchmal einen Event nicht auslösen etc...

3.971 Beiträge seit 2006
vor 13 Jahren

Wird eine Exportdatei eines Fremdsystems dort abgelegt, reicht der Watcher den Dateipfad an die API-Importroutine des empfangenden Systemes weiter

Warum nicht einfach einen Timer (System.Threading.Timer) verwenden, der jede Sekunde entsprechende Verzeichnisse nach neuen Dateien durchsucht und anschließend deine API aufruft? So eine Klasse wäre schnell geschrieben und zu dem ressourcenschonender und skalierbarer als mehrere FileSystemWatcher.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...