Ereignis auslösen, wenn eine neue Datei in einem Verzeichnis auftaucht
-
Hallo,
ich möchte ein Verzeichnis überwachen und immer dann, wenn in diesem Verzeichnis eine neue Datei auftaucht, soll ein Ereignis ausgelöst werden. Wie kann man das machen? Die neue Datei wird von einem anderen Programm erzeugt, an dem ich nichts ändern kann.
Gruß
MichaelP.S. Und die Datei soll dann automatisch geöffnet werden, d.h. ich müsste auch wissen welchen Namen die neue Datei hat.
-
Erstmal: http://www.c-plusplus.net/forum/263084
Die Klasse FileSystemWatcher deckt deine Anforderungen ab:
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspxBenutze die Klasse Process um einen neuen Prozess zustarten:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx
-
Hallo,
theta schrieb:
Die Klasse FileSystemWatcher deckt deine Anforderungen ab:
Super, das hat auf Anhieb funktioniert !
theta schrieb:
Benutze die Klasse Process um einen neuen Prozess zustarten:
Das Programm soll nichts anderes tun als auf neue Dateien zu warten, und diese dann öffnen und auswerten. Bevor die Auswertung abgeschlossen ist wird auch keine neue Datei kommen. Sehe ich das richtig dass es in diesem Fall nicht notwendig ist, einen neuen Prozess zu starten?
Gruß
Michael
-
Das Programm soll nichts anderes tun als auf neue Dateien zu warten, und diese dann öffnen und auswerten. Bevor die Auswertung abgeschlossen ist wird auch keine neue Datei kommen. Sehe ich das richtig dass es in diesem Fall nicht notwendig ist, einen neuen Prozess zu starten?
Nein, das siehst Du nicht richtig. Du kannst Process::Start(..) benutzen.
Anmerkung: Ich habe angenommen, dass z.B. eine XML Datei ankommt und Du sie jetzt mit einem anderen Programm öffnen möchtest (wie wenn Du im Explorer darauf einen Doppelklick machst). Das erzeugt automatisch einen neuen Prozess (und kann programmatisch eben durch Process::Start(..) erledigt werden).
-
theta schrieb:
Nein, das siehst Du nicht richtig. Du kannst Process::Start(..) benutzen.
Anmerkung: Ich habe angenommen, dass z.B. eine XML Datei ankommt und Du sie jetzt mit einem anderen Programm öffnen möchtest (wie wenn Du im Explorer darauf einen Doppelklick machst). Das erzeugt automatisch einen neuen Prozess (und kann programmatisch eben durch Process::Start(..) erledigt werden).Nein, die Datei soll nicht mit einem externen Programm geöffnet werden, sondern sie wird sofort nachdem sie gefunden wurde eingelesen. Die mathematische Auswertung dauert nur einige Sekunden. Sehe ich das richtig, dass unter diesen Voraussetzungen kein neuer Prozess notwendig ist?
Zusatzfrage:
Mal angenommen, während die Auswertung noch nicht abgeschlossen ist wird eine weitere Datei in das Verzeichnis geschrieben. Was passiert dann? Wird ein zweites Ereignis ausgelöst, nachdem das erste Ereignis vollständig abgearbeitet wurde? Oder wird kein zweites Ereignis ausgelöst?Gruß
Michael
-
Nein, die Datei soll nicht mit einem externen Programm geöffnet werden, sondern sie wird sofort nachdem sie gefunden wurde eingelesen. Die mathematische Auswertung dauert nur einige Sekunden. Sehe ich das richtig, dass unter diesen Voraussetzungen kein neuer Prozess notwendig ist?
Ja, das ist korrekt. Dann ist kein neuer Prozess nötig.
Es gibt verschiedene Klassen des Frameworks um Dateien zu lesen.
Was ist es für ein Format? Binär? XML? Text?Zusatzfrage:
Mal angenommen, während die Auswertung noch nicht abgeschlossen ist wird eine weitere Datei in das Verzeichnis geschrieben. Was passiert dann? Wird ein zweites Ereignis ausgelöst, nachdem das erste Ereignis vollständig abgearbeitet wurde? Oder wird kein zweites Ereignis ausgelöst?Es sollte ein weiteres Ereignisausgelöst werden, welches auf einem Thread aus einem Pool ausgeführt wird.
-
Die Ereignisse landen in einer internen Queue. Es kann jedoch passieren, daß bei zuvielen Ererignissen diese Queue dann vom System gekürzt wird, d.h. einige Ereignisse könnten verloren gehen.
Ein Problem generell beim FileSystemWatcher ist es, daß das Ereignis schon beim Anlegen der Datei ausgelöst wird. Wenn die Datei aber sehr groß ist bzw. sehr langsam (z.B. über's Netzwerk) erzeugt wird, dann kann dein Lesevorgang schneller als der Schreibvorgang sein (sofern die Datei überhaupt "shared" gelesen werden kann).
Such mal im Internet nach möglichen Lösungen dafür (z.B. Abfragen der Größe in einem Timer o.ä.).
P.S. Auf die Schnelle habe ich folgenden Blog gefunden (per "FileSystemWatcher problem"): http://blogs.staykov.net/2007/09/filesystemwatcher-problem.html
-
Hallo,
theta schrieb:
Es gibt verschiedene Klassen des Frameworks um Dateien zu lesen.
Was ist es für ein Format? Binär? XML? Text?Binär. Zum Einlesen dieser Datei habe ich auch noch ein paar Fragen. Bisher habe ich nämlich nur mit Text-Dateien gearbeitet.
Die Binär-Datei enthält int16, int32, float und Strings. Es ist genau festgelegt was an welcher Stelle steht, und wie lang die Strings sind. Wo kann ich ein Beispiel finden, wie man so eine Datei mit gemischten Datentypen einliest?Th69 schrieb:
Ein Problem generell beim FileSystemWatcher ist es, daß das Ereignis schon beim Anlegen der Datei ausgelöst wird. Wenn die Datei aber sehr groß ist bzw. sehr langsam (z.B. über's Netzwerk) erzeugt wird, dann kann dein Lesevorgang schneller als der Schreibvorgang sein (sofern die Datei überhaupt "shared" gelesen werden kann).
Danke für diesen Hinweis. Um die Sache nicht unnötig kompliziert zu machen kann ich erst mal eine kleine Zeitverzögerung einbauen, bevor ich die Datei einlese. Oder mehrfach probieren, solange bis das Einlesen klappt.
Gruß
Michael
-
Da hilft ev. der BinaryReader und File::OpenRead(...).
http://msdn.microsoft.com/en-us/library/system.io.binaryreader.aspx
http://msdn.microsoft.com/de-de/library/system.io.file.openread.aspx
-
Hallo,
theta schrieb:
Da hilft ev. der BinaryReader und File::OpenRead(...).
http://msdn.microsoft.com/en-us/library/system.io.binaryreader.aspx
http://msdn.microsoft.com/de-de/library/system.io.file.openread.aspxDas sieht auf den ersten Blick gut aus. Zu diesem Programmteil komme ich aber erst nächste Woche, und falls ich nicht damit klarkomme dann melde ich mich hier nochmal.
Danke für deine Hilfe!
Michael