/ / Verwenden von FileSystemWatcher zum Überwachen eines Verzeichnisses - c #, winforms, io, copy, filesystemwatcher

Verwenden von FileSystemWatcher zum Überwachen eines Verzeichnisses - c #, winforms, io, copy, filesystemwatcher

Ich verwende eine Windows Forms-Anwendung, um ein Verzeichnis zu überwachen und die darin enthaltenen Dateien in ein anderes Verzeichnis zu verschieben.

Im Moment wird die Datei in ein anderes Verzeichnis kopiert, aber wenn eine andere Datei hinzugefügt wird, wird sie einfach mit keiner Fehlermeldung enden. Manchmal kopiert es zwei Dateien, bevor es auf der dritten endet.

Liegt das daran, dass ich eine Windows Form-Anwendung anstelle einer Konsolen-App verwende? Gibt es eine Möglichkeit, das Beenden des Programms zu stoppen und das Verzeichnis weiter zu verfolgen?

private void watch()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}

Antworten:

101 für die Antwort № 1

Das Problem waren die Benachrichtigungsfilter. Das Programm hat versucht, eine Datei zu öffnen, die noch kopiert wurde. Ich habe alle Benachrichtigungsfilter mit Ausnahme von LastWrite entfernt.

private void watch()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}

20 für die Antwort № 2

Sie haben den Dateibearbeitungscode nicht angegeben, aber ichAngenommen, Sie haben den gleichen Fehler gemacht, den alle anderen beim ersten Schreiben machen: Das Filewatcher-Ereignis wird ausgelöst, sobald die Datei erstellt wird. Es wird jedoch einige Zeit dauern, bis die Datei fertig ist. Nehmen Sie eine Dateigröße von beispielsweise 1 GB. Die Datei kann von einem anderen Programm erstellt werden (Explorer.exe kopiert es von irgendwo), aber es dauert einige Minuten, bis dieser Prozess abgeschlossen ist. Das Ereignis wird zum Zeitpunkt der Erstellung ausgelöst und Sie müssen warten, bis die Datei zum Kopieren bereit ist.

Sie können warten, bis eine Datei bereit ist, indem Sie sie verwenden Dies Funktion in einer Schleife.


14 für die Antwort № 3

Der Grund dafür kann sein, dass der Watcher als lokale Variable für eine Methode deklariert ist und dass die Methode bei Abschluss der Methode als Garbage-Collection behandelt wird. Sie sollten es als Klassenmitglied deklarieren. Versuche Folgendes:

FileSystemWatcher watcher;

private void watch()
{
watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}