Hallo,
ich schreibe derzeit ein Programm, dass ein Verzeichnis mit einen Zielverzeichnis synchronisiert.
Das Quell bzw. Zielverzeichnis kann auch eine Netzwerkfreigabe sein.
Jetzt weiß ich nicht, wie ich am Besten fest stellen kann, wann es neue Dateien gibt.
Es gibt für mich folgende mir bekannte Lösungsansätze:
Mit der fileSystemWatcher Klasse die Events auf Änderungen anmelden. Allerdings kann im Zielverzeichnis ein bzw. mehre Ordner sein. Dann müsste ich theoretisch für jedes Verzeichnis ein FileSystemWatcher Objekt haben.
Ich überprüfe jede x Minute die größe vom Quellverzeichnis. Wenn sich die Größe geändert hat, schau ich nach welche Dateien sich geändert haben und kopiere diese aufs Zielverzeichnis.
Allerdings sind beide Lösungsansätze nicht gerade performant. Gibt es bessere?
lg
Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp
Allerdings kann im Zielverzeichnis ein bzw. mehre Ordner sein. Dann müsste ich theoretisch für jedes Verzeichnis ein FileSystemWatcher Objekt haben.
nein, du kannst im filesystemwatcher die eigenschaft "IncludeSubdirectories" auf true stellen. dann überwacht er alles.
Ausgezeichnet, wenn es keine bessere Methode gibt, werde ich diese verwenden.
Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp
huhu,
Allerdings kann es passieren, dass Dir der FileSystemWatcher nicht alle Events ausgibt, wenn z.B. das zu überprüfende Verzeichnis eine Netzwerkfreigabe ist. (Imho ging FileChanged nicht)
😃
Xynraton
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Dass manche Änderungen nicht angezeigt werden, liegt nicht daran, dass es Netzwerkfreigaben o.ä. sind, sondern daran, dass der Puffer überläuft. Dazu steht in der MSDN u.a. folgendes:
Das Betriebssystem Windows meldet der Komponente Änderungen an Dateien, die in einem von FileSystemWatcher erstellten Puffer vorgenommen wurden. Wenn in kurzen Abständen Änderungen vorgenommen werden, kann es zu einem Überlauf des Puffers kommen. Dies führt dazu, dass die Komponente die Änderungen im Verzeichnis nicht mehr verfolgen kann.
(mehr unter FileSystemWatcher in der MSDN
There are 10 kind of people, those who understand binary and those who don't.
richtig. man muss 2 sachen beachten.
in den eventbehandelnden methoden keine lang andauernden aktionen.
wenn man etwas lang andauerndes machen will dann am besten in einem separatem thread.
bei bedarf einfach den puffer vergrößern
dennoch kann es passieren das der puffer überläuft, wenn z.b. sehr sehr viele änderungen auf einmal auftreten.
ich habe beim Beobachten von Netzlaufwerken noch bemerkt, dass sich der FileSystemWatcher gelegentlich ins Nirvana verabschiedet und nichts mehr melden will.
Grund scheinen sporadische kurze Netzwerkausfälle zu sein. In dem Fall wirft der FSW eine Exception und läuft nicht mehr weiter. Deshalb sollte man da das Error-Event des FSW anbinden (sonst bekommt man von der Exception nichts mit!) und den FSW im Falle des Falles neu starten (Achtung bei längeren Ausfällen nicht permanent probieren, sonst geht die Prozessorlast hoch, lieber zwischendurch mal kurz das Programm schlafen lassen).
gruß
sth_Weird
Linux is for free...if your time is worth nothing
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht
++++++++++++++++++++~+
Ahh, Puffer, genau. Und da dies hier auch gilt
Das Festlegen von Filter verringert nicht die in den Puffer geschriebene Datenmenge.
ist auf ner Netzwerkfreigabe durchaus mal schnell was weg. Könnte mein Prob damals gewesen sein. Kann mich nur noch dunkel erinnern.
😃
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.