Laden...

Textdatei auf Änderungen überwachen (möglichst in "realtime")

Erstellt von yngwie vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.070 Views
Y
yngwie Themenstarter:in
238 Beiträge seit 2005
vor 14 Jahren
Textdatei auf Änderungen überwachen (möglichst in "realtime")

Hallo,

folgendes Problem gilt es zu lösen:

  • Application A schreibt sporadisch Meldungen in eine Textdatei
  • Application B (anderer Prozess) liesst aus dieser Textdatei und zeigt den Inhalt in ihrer Textbox an
  • Wie kann Application B möglichst zeitnah merken dass der Inhalt der Textdatei verändert wurde?

Momentan probiere ich dass sich B über einen FilesystemWatcher updatet - wenn allerdings A anfängt die Meldungen sehr oft auszuspucken dann kommt der FilesystemWatcher mit seien Events nicht mehr hinterher und die TextBox aktualisiert sich mit grösserer Verzögerung. Mir ist klar dass bei dieser Geschwindigkeit kein Mensch die TextBox mitlesen kann; dennoch -> kennt vielleicht jemand andere/performatere Ansätze wie B Änderungen an dieser Textdatei mitkriegen kann?

Danke

M
120 Beiträge seit 2009
vor 14 Jahren

Liegt die andere Anwendung auch in deinen Händen? Dann könnte diese eine Meldung an die auslesende Anwendung schicken.

1.433 Beiträge seit 2006
vor 14 Jahren

Wie kann Application B möglichst zeitnah merken dass der Inhalt der Textdatei verändert wurde?

Wie wäre es mit einem Timer der alle 5 Sekunden die Textdatei auf ihre Grösse überprüft. Wenn diese grösser ist als beim letzten Check, dann schreibt er den Inhalt in die besagte Textbox.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

K
34 Beiträge seit 2009
vor 14 Jahren

Oder versuchs mal mit nem FileSystemWatcher

Kleines schnelles Beispiel gibts hier -> http://www.java2s.com/Code/CSharp/File-Stream/SetNotifyFilterofFileSystemWatcher.htm

Mehr Infos zum Gebrauch liefert dir die Msdn-Doku.

Grüße

Gelöschter Account
vor 14 Jahren

Wie wäre es mit einem Timer der alle 5 Sekunden die Textdatei auf ihre Grösse überprüft. Wenn diese grösser ist als beim letzten Check, dann schreibt er den Inhalt in die besagte Textbox.

so bitte nciht... dafür gibt es den besagten filesystemwatcher....

1.433 Beiträge seit 2006
vor 14 Jahren

Wie wäre es mit einem Timer der alle 5 Sekunden die Textdatei auf ihre Grösse überprüft. Wenn diese grösser ist als beim letzten Check, dann schreibt er den Inhalt in die besagte Textbox.

so bitte nciht... dafür gibt es den besagten filesystemwatcher....

Kann muss aber nicht, auch eine Lösung sein. Best Practices natürlich ausgeschlossen.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

Gelöschter Account
vor 14 Jahren

klar.. man kann auch per reflection.emit code einschleusen, das eine native dll generiert und compaliert, welche dann automatisch gestartet wirt, welches dann einen dienst erzeugt und registriert, welches dann alle 50 ms auf den ordner geht und die datei pollt um dann per remoting der ursprünglichen anwendung eine message zu schicken, damit diese weiß das sich etwas geändert hat.

-->

Kann muss aber nicht, auch eine Lösung sein. Best Practices natürlich ausgeschlossen.

deswegen würde ich es dennoch nciht machen.. nur weil es eine lösung ist. solchen gedankengut begegne ich in meinem jetzigen projekt leider vieeeel zu oft.... 😉

U
1.688 Beiträge seit 2007
vor 14 Jahren

Momentan probiere ich dass sich B über einen FilesystemWatcher updatet - wenn allerdings A anfängt die Meldungen sehr oft auszuspucken dann kommt der FilesystemWatcher mit seien Events nicht mehr hinterher und die TextBox aktualisiert sich mit grösserer Verzögerung.

Wie wäre es, ein paar Events zu "sammeln"? Beim Auftreten eines Events wird ein Timer (neu) gestartet und wenn über 1-2 s keine Ereignisse mehr kommen (oder eben spätestens nach 2 s oder auch nach einer festgelegten Anzahl von Ereignissen) werden die Meldungen angezeigt.

Gelöschter Account
vor 14 Jahren

und die TextBox aktualisiert sich mit grösserer Verzögerung

das allerdings liegt höchst wahrscheinlich nciht am filesystemwatcher sondern an deiner art der stringverkettung. siehe: [Artikel] Performant Strings verketten

Y
yngwie Themenstarter:in
238 Beiträge seit 2005
vor 14 Jahren

Hallo Marsti,

ja beide Anwendungen sind von mir. Wie genau kann Anwendung A eine Nachricht an B schicken (wenigstens ein Stichwort) und wie schnell ist so etwas?

Y
yngwie Themenstarter:in
238 Beiträge seit 2005
vor 14 Jahren

Oder versuchs mal mit nem FileSystemWatcher

Sorry aber du hast mein Post nicht (aufmerksam) gelesen - ich verwende bereits einen FileSystemWatcher 😦

Y
yngwie Themenstarter:in
238 Beiträge seit 2005
vor 14 Jahren

Das:

klar.. man kann auch per reflection.emit code einschleusen, das eine native dll generiert und compaliert, welche dann automatisch gestartet wirt, welches dann einen dienst erzeugt und registriert, welches dann alle 50 ms auf den ordner geht und die datei pollt um dann per remoting der ursprünglichen anwendung eine message zu schicken, damit diese weiß das sich etwas geändert hat.

ist eine sehr interessante Idee 😃

und das:

das allerdings liegt höchst wahrscheinlich nciht am filesystemwatcher sondern an deiner art der stringverkettung.

eine gewagte Annahme 😄

Übrigens, die Verzögerung scheint durch die Bufferung des in A verwendenten TraceWriters zu entstehen - behoben durch das regelmäßige Aufrufen von Flush() 😛

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo yngwie,

wenn beide Anwendungen von dir sind, warum benutzt du dann eine Datei zur Kommunikation? Du könntest die Daten doch auch direkt von einer Anwendung zur anderen senden.

Aber wieder auch sei. Das Stichwort ist in beiden Fällen Interprozesskommunikation (IPC), egal ob du die Daten sendest oder nur die Mitteilung, dass neue Daten vorhanden sind.

herbivore

Gelöschter Account
vor 14 Jahren

eine gewagte Annahme 😄

jain. ist eines der häufigsten fehlern bei der programmierung mit .net. ich habe einfach eine symptim mit der statischten häufung von fehlprogrammierung kombiniert.

wie dem auch sei... ich habe richtig vermutet, das es nciht am filesystemwatcher liegt 😃

remoting ist ein etwas spezifischeres stichwort 😉