Filesystemwatcher
-
Hallo,
hab mir ein kleines tool zur Dateiüberwachung eines Verzeichnisses gebaut.
Habe mich dabei an diesem Beispiel orientiert:http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher(v=vs.80).aspx
Wenn eine neue Datei in das Verzeichnis gelangt, lasse ich mir eine MessageBox anzeigen. Was mich jetzt dabei stört, ist folgendes:
Bei mehreren Dateien zeigt es mir dann dementsprechend auch mehrere Messageboxen hintereinander an, da das OnChanged-Ereignis ja für jede Datei aufgerufen wird. Ich habe mir das nun so vorgestellt, dass es mir nur einmal die Messagebox anzeigen soll (als Hinweis) und ich die Dateien dann z.B. in einer Listbox ausgebe. Aber wie kann ich das realisieren?
-
Wann weißt du denn, wann keine neuen Dateien mehr hinzugefügt werden?
-
im Moment gar nicht....die Frage hat sich mir auch schon gestellt^^
-
Da wirst du es dann wohl nur mit einem Timer lösen können, d.h. du sammelst alle Änderungen und zeigst sie dann nach einer bestimmten Zeit an.
Anstatt einer MessageBox würde ich jedoch ein eigenes Form entwickeln, so daß du dann während das Form noch offen ist, per Event weitere Änderungen anzeigen kannst (ansonsten müßte der User ja erst die MessageBox wegklicken, um dann wieder die neuen Änderungen zu sehen).
-
Du darfst keine MsgBox anzeigen, sondern ein eigenes Fenster. Dort muss Du dann bei neuen ChangeEvents die Daten "reinstecken"; dies musst Du aber synchronisiert machen, da Du nicht von einem anderen Thread auf die UI zugreifen darfst.
Und mach das ganze bitte nicht in C++/CLI sondern, in C#:
http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/
-
Also habe jetzt noch eine ganze Weile dran rumgetüftelt aber so richtig kam noch nicht das raus was ich wollte.
Das tool läuft ja bei mir tray und mir würde es im Prinzip schon reichen, wenn eine neue Datei eintrifft, das das Fenster dann von selber wieder in den Vordergrund kommt und mir in einer Listbox die neuen Dateien anzeigt. Nur es scheitert schon daran, das tool aus dem OnChanged-Ereignis in den Vordergrund zu holen. Wenn ich dort ein einfachesThis->Show
einfüge bekomme ich beim Kompilieren folgende Fehler:
error C2355: 'this': Nur innerhalb nicht statischer Memberfunktionen verfügbar
error C2227: Links von "->Show" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.Wie kann ich das richtig aufrufen? Das selbe Problem hab ich, wenn ich eine ListBox aus diesem OnChanged-Ereignis füllen will. Da bekommen ich auch keinen Zugriff auf die ListBox.
Hier nochmal das besagte Ereignis:
private: static void OnChanged( Object^ /*source*/, FileSystemEventArgs^ e ) { // Specify what is done when a file is changed, created, or deleted. MessageBox::Show("Neu: " + e->FullPath, "Aktivität verzeichnet", MessageBoxButtons::OK, MessageBoxIcon::Exclamation ); }
-
Steht doch da: OnChanged ist static (also keinem Objekt zugeordnet) und hat daher keinen this-Zeiger.
Lösung: OnChanged _nicht_ static machen.
Ansonsten schließe ich mich Jochen an:
Jochen Kalmbach schrieb:
Und mach das ganze bitte nicht in C++/CLI sondern, in C#:
http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/
-
Danke, das hat soweit schonmal funktioniert.
-
Jochen Kalmbach schrieb:
Du darfst keine MsgBox anzeigen, sondern ein eigenes Fenster. Dort muss Du dann bei neuen ChangeEvents die Daten "reinstecken"; dies musst Du aber synchronisiert machen, da Du nicht von einem anderen Thread auf die UI zugreifen darfst.
Und mach das ganze bitte nicht in C++/CLI sondern, in C#:
http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/Jetzt bin ich an der Stelle wo ich merke das das ohne syncronisieren nicht klappt. Wie kann ich das syncronisieren? Ein kleines Stück Code wäre nett.
-
this.BeginInvoke/Invoke!? (wobei "this" ein Windows-Form oder ein Control ist)