C #: Überwachung von kopierten oder verschobenen Dateien mit FileSystemWatcher

8

Ich bin hier und über das Internet auf mehrere "Lösungen" gestoßen, aber keine scheint zu passen.

Ich möchte eine App haben, die einen Ordner auf neue Dateien überwacht (entweder durch Erstellung, Verschieben oder Kopieren) und Aktionen für diese Objekte ausführt. In diesem Szenario wandte ich mich an die FileSystemWatcher-Klasse, um diese Aktion durchzuführen.

Das Problem ist, dass die Datei FileSystemWatcher.Created Ereignis ausgelöst wird, bevor die gesamte Datei erstellt wird (am deutlichsten durch eine Kopie einer großen Datei gesehen).

Gibt es eine Möglichkeit, dieses Ereignis am Ende der Dateierstellung im Gegensatz zum Anfang zu feuern? Ich habe verschiedene Kombinationen der FileSystemWatcher.NofityFilter-Eigenschaft mit keinem Erfolg versucht.

Vielen Dank im Voraus! :)

    
nokturnal 09.08.2010, 00:11
quelle

4 Antworten

6

Ich habe ein paar Lösungen für diese Situation verwendet.

  1. Wenn Sie mit dem Ersteller der Datei arbeiten und ein Umbenennungsschema für die Datei verwenden können. Z.B. Erstellen Sie die Datei während der Erstellung als __ Name _ und benennen Sie sie am Ende des Prozesses in Name um. Das Ereignis wird ausgelöst und Sie haben eine vollständige Datei Datei.

  2. Wenn Ihr Auslöser ausgelöst wird, prüfen Sie, ob Sie eine exklusive schreibgeschützte Sperre für die Datei erhalten. Wenn Sie können dann ist der Schreibvorgang in die Datei abgeschlossen. (Ich schrieb etwas darüber in einer anderen Frage Einstellungen zwischen der Formularanwendung und dem Windows-Dienst (oder einem beliebigen n-Tier) synchronisieren )

Sie könnten möglicherweise etwas wie # 2 in Ihr Changed Event integrieren und dann erhalten Sie das Ergebnis.

    
Paul Farry 09.08.2010, 00:45
quelle
1

Hmm, interessantes Problem. Ich habe das Objekt nie benutzt, während ich auf große Dateien geachtet habe. Habe ein wenig gesucht und scheint eine Lösung zu sein, das Changed-Event ebenfalls zu überwachen. Denn sobald die Datei kopiert wurde (nachdem die Datei erstellt wurde), wird auch ein geändertes Ereignis ausgelöst (weil die Datei größer geworden ist)

Weitere Details von dem, was ich hier gelesen habe: Ссылка

    
Ashley Grenon 09.08.2010 00:22
quelle
1

Ich weiß, dass das, was ich dir sagen werde, nicht elegant aussieht. Ich musste auch Dateien überwachen, die von verschiedenen Orten kamen, von denen einige groß und einige klein waren. Wir haben herausgefunden, dass FileSystemWatcher für diesen Zweck nicht zuverlässig ist. Wenn Sie 100% sicher sein möchten, können Sie ab und zu mit der Timer-Klasse und dem Ereignis Elapsed nachsehen.

    
Boris Modylevsky 09.08.2010 07:16
quelle
0

Sie müssten das Schließen der Datei nach der Erstellung verfolgen und ich bezweifle, dass dies mit FileSystemWatcher möglich ist. Wenn Sie mit FileSystemWatcher keine Lösung finden, werfen Sie einen Blick auf unser Produkt CallbackFilter , mit dem Sie alle Vorgänge in Echtzeit verfolgen können -Zeit.

    
quelle