2009-06-02 8 views
13

Używam pliku .net 2.0 do przeglądania folderu dla nowych plików. Działa doskonale, z wyjątkiem sytuacji, gdy umieszczam więcej niż ~ 80 plików naraz. Wydarzenie już się nie uruchamia. To tak, jakby w filewatcherze ustawiono śledzenie określonej liczby plików..Net FileWatcher kończy się niepowodzeniem dla plików ~ 80 +

Na razie poprosiłem użytkownika, aby nie umieszczał więcej niż 50 plików na raz i to wydaje się działać, ale chciałbym to naprawić, aby setki plików mogły być wrzucone do folderu na raz.

Oto kod, którego używam do zdarzenia. To dość standardowa rzecz, nic nadzwyczajnego.


FileWatcher = new FileSystemWatcher(); 
FileWatcher.Path = ConfigurationManager.AppSettings["FolderOfFilesToWatch"]; 
FileWatcher.NotifyFilter = NotifyFilters.FileName; 
FileWatcher.Filter = "*_*_*.*"; 
FileWatcher.Created += new FileSystemEventHandler(watcher_Created); 
FileWatcher.EnableRaisingEvents = true; 


static void watcher_Created(object sender, FileSystemEventArgs e) 
{ 
Console.Write(e.Name); 
} 

Wszelkie pomysły?

+0

patrz [Zagadnienia dotyczące zmian w plikach na systemach wysoka ilość] (http: // MSDN. microsoft.com/en-us/library/ded0dc5s.aspx). –

Odpowiedz

14

Prawdopodobnie trzeba zwiększyć FileSystemWatcher. InternalBufferSize. Domyślnie FileSystemWatcher używa mniejszego bufora dla wydajności i może się przepełnić, jeśli zbyt wiele zmian nastąpi w krótkim czasie.

Spróbuj ustawić większy rozmiar bufora, aby zapobiec wystąpieniu tego błędu.

+2

Po prostu bądź bardzo ostrożny: jak na MSDN: "Zwiększanie rozmiaru bufora jest drogie, ponieważ pochodzi z pamięci niestronicowanej, która nie może być zamieniona na dysk, więc bufor powinien być tak mały, jak to możliwe. Aby uniknąć przepełnienia bufora, użyj opcji NotifyFilter i IncludeSubdirectories właściwości, aby odfiltrować niechciane powiadomienia o zmianach. " –

+0

@ocdecio: Tak. Używa już programu NotifyFilter, więc byłoby po prostu kwestią, czy on śledzi podkatalogi.Jego specyficzną prośbą było śledzenie "setek" plików, które będą wymagały rozmiaru bufora trochę większego niż domyślny rozmiar 4k. –

2

Używam FileWatchera, ale zastosowałem podejście "pas i szelki". Ilekroć dostaję wydarzenie FileWatcher, trzymam się i sprawdzam pliki, których wcześniej nie widziałem (w moim przypadku mam katalog plików). Uwierz mi, nadejdzie czas, kiedy tysiące plików zostanie zrzuconych do folderu i musisz mieć inne zabezpieczenie, aby uwzględnić je wszystkie.

Inną alternatywą, którą możesz obejrzeć, jest change journals, chociaż jest ona (AFAIK) ograniczona do dysków podłączonych do twojego komputera, podczas gdy możesz używać FileWatchera do śledzenia ścieżek UNC.

1

Możliwe, że przekroczysz liczbę wątków Thread systemu. Kiedy FileSystemWatcher odpala zdarzenie, robi to z wątku pobranego z tej puli. Możliwe jest utracenie tych zdarzeń, jeśli nie masz wystarczającej liczby wątków przydzielonych do twojego ThreadPool.

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

jak inni, a szczególnie 'ocdecio' zauważyli, że jest dobry, aby nie całkowicie zaufać FileSystemWatcher. Jest notorycznie niespójny pod dużym obciążeniem.

0

Uwa aj, e akcje CIFS mają pewne własne ustawienia, na które trzeba zwrócić uwagę. 50 jest najwyraźniej wartością domyślną dla większości liczby komend udziału plików (nie wiem wystarczająco dużo o tym, aby wiedzieć cokolwiek poza określeniem ... przepraszam)

W każdym razie - ta kwestia nas dręczyła - i na szczęście Nasz sprzedawca był na tyle uprzejmy, aby wskazać nam ten problem.

Rzuć okiem tu i zobaczyć, czy to może pomóc uzyskać nad magicznym 50 ...

http://support.microsoft.com/kb/810886

Powiązane problemy