FileSystemWatching wieder stoppen
-
Ich habe einen Button. Wenn man einmal drauf klickt, soll ein FileSystemWatcher gestartet, und beim zweiten Klick auf diesen Button wieder geschlossen werden. Wie könnte ich sowas am besten realisieren? Gibt es irgent eine Funtktion, mit der man den einmal gestarteten Watcher wieder beenden kann?
Mein Lösungsansatz:
Beschreibung:
Ich habe einen Button, der eine Funktion aufruft, wenn er angeklickt wird. Des weiteren setzt er eine bool Variable(nennen wir sie mal active) auf true. Wenn man nochmal auf den Button clickt, dann setzt er die Varible(active) wieder auf false und ruft die Funktion erneut auf.
In dieser Funktion wird eine FileSystemWatching-Klasse aufgerufen und die Methode EnableRaisingEvents bekommt den wert von active zugewiesen.
Für active=true geht das ganze auch ganz gut, aber man kann die einmal gestartete Klasse nicht mehr beenden!Quelltext: (Nur Auszüge von wichtigen Stellen)
static bool watchingDirectory; ... private void button1_Click(object sender, System.EventArgs e) { if(watchingDirectory==false) { watchingDirectory=true; watchDirectory(); startLogging.Text="Abbrechen"; } else { watchingDirectory=false; watchDirectory(); startLogging.Text="Überwachung starten"; } } public static void watchDirectory() { //Hier wird das Verzeichnis überwacht: try { FileSystemWatcher watcher =new FileSystemWatcher(); watcher.Path=cfgXmlPath; //Welcher Ordner soll überwacht werden? watcher.Filter="*.xml"; watcher.Created+=new FileSystemEventHandler(newFile); watcher.EnableRaisingEvents=watchingDirectory; } catch(Exception error) { MessageBox.Show("Es ist ein Fehler aufgetreten\n"+error); } } public static void newFile(object source, FileSystemEventArgs e) { //Was geschieht, wenn eine neue Xml-Datei gefunden wird? MessageBox.Show(e.ToString()); }
mfg
Frank Englert
-
Ruf die Dispose() Methode auf.
-
Kannst du bitte genauer erklären, wie du das meinst?
So wie ich das versucht habe, geht das leider nicht!
[cpp]
public static void watchDirectory()
{
//Hier wird das Verzeichnis überwacht:
try
{FileSystemWatcher watcher =new FileSystemWatcher();
watcher.Path=cfgXmlPath; //Welcher Ordner soll überwacht werden?
watcher.Filter="*.xml";
watcher.Created+=new FileSystemEventHandler(newFile);
watcher.EnableRaisingEvents=true;
if(watchingDirectory==false)
{
watcher.Dispose();
}}
catch(Exception error)
{
MessageBox.Show("Es ist ein Fehler beim Überwachen des Verzeichnisses aufgetreten");
}
}
[cpp]
-
ich hatte damit gemeint, dass, wenn du Dispose() aufrufst, dann wird dein Watcher "gekillt".
Dispose() gibt die von Component verwendeten Ressourcen frei.
Das sollte reichen, um die Überwachung zu beenden. Danach ist allerdings auch deine "Watcher"-Instance nicht mehr gültig und, wenn du sie noch mal brauchst, muss du sie neu erzeugen.
Das Alles ist aber nur theorie, getestet habe ich das nicht.
-
oder du hast vielleicht gemeint, wie man das Created-Ereignis wieder lösst?
wenn ja, dann ist es ganz einfach:
watcher.Created -= new FileSystemEventHandler(newFile);
-
So geht es leider auch nicht!!!
Ich hab jetzt das eingentliche Problem erfasst! Ich denke, ich starte einen neuen Thread für dieses FS-Watching, und beeende diesen, wenn man auf abbrechen klickt!
Aber trotzdem danke für deine schnelle Hilfe!