Używam aplikacji Windows Forms do monitorowania katalogu i przenoszenia plików upuszczonych w nim do innego katalogu.
W tej chwili skopiuje plik do innego katalogu, ale po dodaniu innego pliku zakończy się po prostu bez komunikatu o błędzie. Czasami kopiuje dwa pliki, zanim zakończy się na trzecim.
Czy to dlatego, że używam aplikacji Windows Form, a nie aplikacji konsoli? Czy jest sposób, aby zatrzymać program przed zakończeniem i dalej obserwować katalog?
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();
}
Nie dostarczyłeś kodu obsługi pliku, ale zakładam, że popełniłeś ten sam błąd, który każdy popełnia podczas pierwszego pisania czegoś takiego: zdarzenie filewatcher zostanie wywołane zaraz po utworzeniu pliku. Jednak ukończenie pliku zajmie trochę czasu. Weźmy na przykład rozmiar pliku 1 GB. Plik może zostać utworzony przez inny program (Explorer.exe kopiujący go skądś), ale zakończenie tego procesu zajmie kilka minut. Zdarzenie jest wywoływane w czasie tworzenia i musisz poczekać, aż plik będzie gotowy do skopiowania.
Możesz poczekać, aż plik będzie gotowy, używając tej funkcji w pętli.
źródło
Przyczyną może być to, że watcher jest zadeklarowana jako zmienna lokalna metody i jest usuwana z pamięci po zakończeniu metody. Powinieneś zadeklarować go jako członka klasy. Spróbuj wykonać następujące czynności:
źródło
watcher
zmienna jest utrzymywana (nie zbierana), ponieważ zasubskrybował wydarzenie Changed.true
. Nie sądzę, aby status programów obsługi zdarzeń członkowskich miał coś wspólnego z wyrzucaniem elementów bezużytecznych. Myślę, że EnableRaisingEvents ma, co mógłbym nazwać, szczególne zachowanie w tym przypadku.