Ich verwende eine Windows Forms-Anwendung, um ein Verzeichnis zu überwachen und die darin abgelegten 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, endet sie einfach ohne Fehlermeldung. Manchmal werden zwei Dateien kopiert, bevor die dritte endet.
Liegt das daran, dass ich eine Windows Form-Anwendung anstelle einer Konsolenanwendung verwende? Gibt es eine Möglichkeit, das Beenden des Programms zu stoppen und das Verzeichnis weiter zu überwachen?
private void watch()
{
this.watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += OnChanged;
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}
public void Dispose()
{
// avoiding resource leak
watcher.Changed -= OnChanged;
this.watcher.Dispose();
}
Sie haben den Code für die Dateibehandlung nicht angegeben, aber ich gehe davon aus, dass Sie beim ersten Schreiben des gleichen Fehlers den gleichen Fehler gemacht haben: Das Filewatcher-Ereignis wird ausgelöst, sobald die Datei erstellt wird. Es wird jedoch einige Zeit dauern, bis die Datei fertig ist. Nehmen Sie zum Beispiel eine Dateigröße von 1 GB. Die Datei wird möglicherweise von einem anderen Programm erstellt (Explorer.exe kopiert sie von irgendwoher), aber es dauert Minuten, bis dieser Vorgang abgeschlossen ist. Das Ereignis wird zur Erstellungszeit ausgelöst und Sie müssen warten, bis die Datei zum Kopieren bereit ist.
Sie können warten, bis eine Datei fertig ist, indem Sie diese Funktion in einer Schleife verwenden.
quelle
Der Grund kann sein, dass Watcher als lokale Variable für eine Methode deklariert wird und nach Abschluss der Methode Müll gesammelt wird. Sie sollten es als Klassenmitglied deklarieren. Versuche Folgendes:
quelle
watcher
Die Variable wird am Leben erhalten (kein gesammelter Müll), da er das geänderte Ereignis abonniert hat.true
. Ich glaube nicht, dass der Status von Event-Handlern für Mitglieder mit der Speicherbereinigung zu tun hat. Ich denke, EnableRaisingEvents hat, wie ich es nennen könnte, in diesem Fall ein besonderes Verhalten.