Czy jest coś takiego jak inotify w systemie Windows?


103

W systemie Linux istnieje podsystem ionotify, który powiadamia aplikację o zmianach w systemie plików.

Jednak jestem głównie użytkownikiem systemu Windows, więc zastanawiałem się, czy istnieje podobny sposób monitorowania zmian w systemie plików?


9
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”.
David

Odpowiedzi:



42

Jeśli używasz .net , użyj FileSystemWatcher. Więcej informacji tutaj: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Jeśli używasz C , wykorzystywania FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Więcej informacji tutaj: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

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.


6
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.
n611x007


11

JNotify lub FileMon firmy Microsoft.


8
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.
cmyers

1
FileMon to teraz ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU

10

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.


Czy dziennik USN jest inny, czy poleganie na nim pozwala uniknąć błędnego zachowania FileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmes 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.


Bardziej ogólnie jest dostępny tylko na systemach plików NTFS, ale nie na FAT16, FAT32 ani nawet w nowym exFAT.
Mastacheata

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.