2011-01-31 9 views
5

Szukam niezawodnego sposobu na szukanie zmian w katalogu.Wiarygodny sposób monitorowania zmian plików w katalogu przy użyciu architektury .NET Framework

Próbowałem używać FileSystemWatcher, ale jest to raczej niedokładne, gdy wiele małych plików jest tworzonych, zmienianych lub usuwanych. Brakuje około 1 lub 2% plików w moich testach. To bardzo dużo, gdy szybko dodajesz lub zmieniasz tysiące plików.

Próbowałem pobierania dla zmian w różnych odstępach 500 ms, 2000 ms itd. W tym przypadku otrzymuję zbyt wiele trafień. To może mieć coś wspólnego z rozdzielczością znaczników czasu w obiekcie FileInfo.

Moje pytanie brzmi; czy jest możliwe, aby za pomocą platformy .NET Framework uzyskać niezawodnie zmiany w katalogu?

- Christian

Odpowiedz

7

Czy próbowałeś/aś zwiększyć InternalBufferSize? Jaki rozmiar ustawiłeś?

Z MSDN:


Zauważ, że FileSystemWatcher mogą nie zdarzenia, gdy rozmiar bufora przekroczona. Aby uniknąć brakujących zdarzeń, należy postępować zgodnie z poniższymi wytycznymi: Zwiększ rozmiar bufora o , ustawiając właściwość InternalBufferSize na . Unikaj oglądania plików o długich nazwach plików, , ponieważ długa nazwa pliku przyczynia się do wypełnienia bufora . Zastanów się, zmieniając nazwy tych plików, używając krótszych nazw .


Zachowaj swój kod obsługi zdarzenia był jak najkrótszy.

+0

Dziękuję, to na razie rozwiązuje moje problemy. Nie można zmusić go do pominięcia plików z buforem 64 KB, należy uruchomić jeszcze kilka testów, aby znaleźć optymalne ustawienia. –

4

Tak, właściwa kontrola odbywa się za pomocą sterownika filtru systemu plików. Sterownik przechwytuje wszystkie żądania przesyłane do systemu plików po ich wysłaniu (przed lub po dotarciu do systemu plików). W ten sposób otrzymujesz wszystkie powiadomienia w odpowiednim czasie (lub nawet przed zdarzeniem) i możesz kontrolować, jakie wnioski są przekazywane, a jakie informacje przekazywane z prośbą.

Możesz samodzielnie napisać taki sterownik filtra (~ 6-9 roboczo-miesięcy pracy, aby go wykonać poprawnie, a następnie dużo czasu na testowanie) lub możesz użyć naszego produktu CallbackFilter i uniknąć rozwoju trybu jądra. CallbackFilter oferuje wbudowany sterownik i interfejsy API dla .NET, VCL i natywnego C++.

+1

Dziękuję za sugestię, Eugene, rzeczywiście przyglądałem się twojemu CallbackFilterowi, kiedy szukałem projektu, który został złomowany. To jest projekt hobby, więc na razie muszę go utrzymywać. Ale będzie Cię pamiętać;) –

+3

@Eugene: Ta odpowiedź została oznaczona jako spam przez kilku użytkowników. Nie jestem przekonany, że tak jest, ponieważ (mimo że nie jest ekspertem w tej dziedzinie) wygląda na to, że twój produkt faktycznie * stanowi * rozwiązanie problemu. Jednak w przyszłości warto rozważyć nadanie bardziej oczywistego charakteru promowaniu własnego produktu. Być może zastrzeżenie na dole lub coś takiego. I +1, aby przeciwdziałać spadkom. –

+1

@Cody Gray - wyrażenie "nasz ... produkt" wraz z nazwą użytkownika mówi całkiem wyraźnie, tak jak dla mnie, i zostało to już wcześniej omówione (oba omówione na Meta i przetestowane tutaj) i zaakceptowane. –

Powiązane problemy