Nie sądzę, żeby takie pytania były nie na temat. Pytanie dotyczy API systemu operacyjnego, które różni się znacznie od każdej biblioteki narzędzi / oprogramowania. Być może można to sformułować inaczej, jak sposób otrzymywania powiadomień w aplikacji Windows o modyfikacji określonego pliku / plików.
balki
1
Zagłosowano na ponowne otwarcie: pytanie dotyczy porównywalnej alternatywy dla określonego interfejsu API systemu operacyjnego i obrazowo brzmi dla mnie w stylu: „Jestem z Anglii, gdzie używam widelca do jedzenia, a w Japonii jakiego naczynia używam w podobny sposób? " Zaakceptowaną odpowiedzią wykorzystującą tę analogię jest „użyj pałeczek”.
W systemie OSX odpowiednim interfejsem API jest fseventsapi.
Wszystkie nieznacznie się od siebie różnią i wszystkie mają wątpliwą niezawodność w skrajnych przypadkach. Ogólnie rzecz biorąc, nie można polegać na tych interfejsach API, aby uzyskać pełny obraz wszystkich zmian w 100% przypadków. Większość osób korzystających z monitorowania systemu plików łączy je z okresowymi skanami, aby zrekompensować utracone lub niekompletne informacje z interfejsu API push.
Czy możesz podać kilka cytatów na temat „wątpliwej wiarygodności w przypadku inotify?”
Pharaun,
18
Jeśli konsument fs watcher api odczytuje zdarzenia wolniej niż inny proces je generuje, jądro musi albo wstrzymać modyfikacje systemu plików w innym procesie (prawdopodobnie o wyższym priorytecie), albo pozwolić na nieograniczony wzrost bufora. Głębokość bufora inotify (jak udokumentowano na stronie podręcznika) jest kontrolowana przez / proc / sys / fs / inotify / max_queued_events. Poza tym otrzymujesz powiadomienie IN_Q_OVERFLOW - to dobrze, ale nadal pozostajesz w sytuacji, w której może być konieczne ponowne skanowanie od czasu do czasu.
blucz 19.08.10
Aha, racja, ostatnio czytałem w kolejce. Myślę, że ten skrajny przypadek zależałby od liczby monitorowanych plików, a także od tego, czy ma to kluczowe znaczenie dla śledzenia wszystkich zmian, czy też kilka można pominąć. Ale to dobra uwaga. Dzięki :)
Pharaun
@blucz Zastanawiałem się, jak ludzie z jądra rozwiązują takie sytuacje. Dobrze wiedzieć, że to robią, dodaje pewności siebie w projektowaniu i wdrażaniu.
JNotify był dla mnie idealny, ponieważ potrzebowałem kompatybilności między platformami. Udało mi się nawet napisać pojedynczy skrypt bash, który działał w cygwin, mac i linux, zakładając tylko, że JAVA_HOME został ustawiony poprawnie. Było to bardzo pomocne przy debugowaniu problemów na komputerach klientów, kiedy mówią "usunęli mój plik!" Mogę spojrzeć na dziennik i spróbować dowiedzieć się, jak / kiedy to się stało.
System Windows ma funkcję podobną do zdarzeń OSX, dzięki której można monitorować zdarzenia bez uruchamiania aplikacji. Dziennik USN systemu Windows śledzi wszystkie zmiany plików. Jeffrey Richter (autor Advanced Windows) napisał wspaniały artykuł z działającymi przykładami dla MSDN Journal. Aktualizacja : artykuł z archive.org, ponieważ MSJ nie jest już online w MS.
Dzienniki zmian USN są prawdopodobnie lepsze, jeśli tworzysz aplikacje, takie jak narzędzia do tworzenia kopii zapasowych lub indeksy, które muszą monitorować całe woluminy.
Czy dziennik USN jest inny, czy poleganie na nim pozwala uniknąć błędnego zachowania FileSystemWatcher| FindFirstChangeNotificationPhillipBrandonHolmes został mówiąc ?
n611x007
4
Minęło trochę czasu, odkąd nad tym pracowałem, ale nie używa on FileSystemWatcher ani FindFirstChangeNotification. Zacząłem pisać obserwatora zdarzeń Windows w Go, opierając się głównie na przykładach Jeffery'ego Richtera. Po testach, które przeprowadziłem, jest solidny i niczego nie brakuje, podobnie jak fsevents w OS X. Gist jest tutaj: gist.github.com/pkrnjevic/7219861
Peter Krnjevic
@PeterKrnjevic Czy możesz zaktualizować link do artykułu Jeffreya Richtera?
SOUser
@SOUser, ze względu na MS bitrot, artykuł jest teraz powiązany z archive.org.
Peter Krnjevic
3
Funkcja FileSystemWatcher () jest zawodna, głównie ze względu na fakt, że obsługa błędów bufora obserwatora jest mniej więcej niekompletna. Ze względu na brak ścieżki i szczegółowych informacji dotyczących obsługi błędów firma Microsoft nie daje możliwości odzyskania ani ręcznego sondowania katalogu roboczego.
JNotify dla Windows jest również zawodny, ponieważ ten błąd ^ pochodzi z win32. JNotify używa win32. Tak więc nie różni się od FileSystemWatcher ().
myśląc o tym, jak zaprojektować role, aby rozwiązać ten problem podobny do „prędkości” / „rasy” / „przepełnienia”, sam się zastanawiałem, jak to zrobiły jądra. Ciekawy. Dzieje się tak również w przypadku sieci i logowania. Czy ten problem ma nazwę?
n611x007
Tak, nazywa się „błąd”. Błąd (win32) pozostał w każdym systemie operacyjnym stworzonym do tej pory przez Microsoft. To sprawia, że każdy system operacyjny Microsoft nie nadaje się do rozwiązania typu obserwującego pliki. Musisz iść * nix, aby to osiągnąć. Czasami myślę, że ze względów bezpieczeństwa celowo zostawili przepełnienie tego bufora.
Phillip Brandon Holmes
haha… tak… jego nazwa to celowe połączenie klastrów, aby system plików firmy Microsoft nie mógł być celowo obserwowany. To błąd, który zostawili ze względu na obawy dotyczące bezpieczeństwa.
Phillip Brandon Holmes
1
Trochę szukałem, wydaje mi się, że widziałem coś podobnego dla Windows. Istnieje
FileSystemWatcher dla .NET. Jest przeznaczony głównie dla NT lub XP i do przodu.
Odpowiedzi:
Zobacz FindFirstChangeNotification API lub odpowiednik .NET FileSystemWatcher
źródło
Jeśli używasz .net , użyj
FileSystemWatcher
. Więcej informacji tutaj: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspxJeśli używasz C , wykorzystywania
FindFirstChangeNotification
,FindNextChangeNotification
,ReadDirectoryChangesW
. Więcej informacji tutaj: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspxW systemie OSX odpowiednim interfejsem API jest
fsevents
api.Wszystkie nieznacznie się od siebie różnią i wszystkie mają wątpliwą niezawodność w skrajnych przypadkach. Ogólnie rzecz biorąc, nie można polegać na tych interfejsach API, aby uzyskać pełny obraz wszystkich zmian w 100% przypadków. Większość osób korzystających z monitorowania systemu plików łączy je z okresowymi skanami, aby zrekompensować utracone lub niekompletne informacje z interfejsu API push.
źródło
spójrz na to: inotify-win, port narzędzia inotifywait dla systemu Windows
a także to: inotify-tools
źródło
JNotify lub FileMon firmy Microsoft.
źródło
Trochę późno, ale ...
System Windows ma funkcję podobną do zdarzeń OSX, dzięki której można monitorować zdarzenia bez uruchamiania aplikacji. Dziennik USN systemu Windows śledzi wszystkie zmiany plików. Jeffrey Richter (autor Advanced Windows) napisał wspaniały artykuł z działającymi przykładami dla MSDN Journal. Aktualizacja : artykuł z archive.org, ponieważ MSJ nie jest już online w MS.
Dokumentacja MSDN dotycząca dzienników zmian USN.
Dzienniki zmian USN są prawdopodobnie lepsze, jeśli tworzysz aplikacje, takie jak narzędzia do tworzenia kopii zapasowych lub indeksy, które muszą monitorować całe woluminy.
źródło
FileSystemWatcher
|FindFirstChangeNotification
PhillipBrandonHolmes został mówiąc ?Funkcja FileSystemWatcher () jest zawodna, głównie ze względu na fakt, że obsługa błędów bufora obserwatora jest mniej więcej niekompletna. Ze względu na brak ścieżki i szczegółowych informacji dotyczących obsługi błędów firma Microsoft nie daje możliwości odzyskania ani ręcznego sondowania katalogu roboczego.
JNotify dla Windows jest również zawodny, ponieważ ten błąd ^ pochodzi z win32. JNotify używa win32. Tak więc nie różni się od FileSystemWatcher ().
źródło
Trochę szukałem, wydaje mi się, że widziałem coś podobnego dla Windows. Istnieje FileSystemWatcher dla .NET. Jest przeznaczony głównie dla NT lub XP i do przodu.
źródło
wypróbuj Java File Notification Library
źródło