Есть ли что-нибудь вроде inotify в Windows?

103

В ОС Linux есть подсистема ionotify, которая уведомляет приложение об изменениях в файловой системе.

Однако я в основном пользователь Windows, поэтому мне было интересно, есть ли аналогичный способ отслеживания изменений файловой системы?

Йоханссон
источник
9
Не думаю, что такие вопросы не по теме. Вопрос касается API ОС, который сильно отличается от любого инструмента / библиотеки программного обеспечения. Может быть, это можно сформулировать по-другому, например, как получить уведомление в приложении Windows, когда конкретный файл / файлы изменяются.
balki
1
Проголосовали за повторное открытие: вопрос запрашивает сопоставимую альтернативу API конкретной операционной системы и образно звучит для меня как «Я из Англии, где я использую вилку, чтобы есть пищу, в Японии, какую посуду я использую аналогичным образом? " Принятый ответ, использующий эту аналогию, - «использовать палочки для еды».
Дэвид

Ответы:

42

Если вы используете .net , используйте FileSystemWatcher. Больше информации здесь: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Если вы используете C , использование FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Дополнительная информация здесь: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

В OSX соответствующим api являетсяfsevents api.

Все они слегка отличаются друг от друга, и все они имеют сомнительную надежность в крайних случаях. В общем, вы не можете полагаться на эти API для получения полного представления обо всех изменениях в 100% случаев. Большинство людей, использующих мониторинг файловой системы, сочетают его с периодическим сканированием, чтобы компенсировать потерянную или неполную информацию из push api.

Blucz
источник
6
Не могли бы вы процитировать «сомнительную надежность в крайнем случае для inotify?»
Фарон,
18
Если потребитель api наблюдателя fs медленнее при чтении событий, чем какой-либо другой процесс при их создании, ядру необходимо либо задержать изменения файловой системы в другом (возможно, более высоком приоритетном) процессе, либо разрешить неограниченное увеличение буфера. Глубина буфера inotify (как описано на странице руководства) контролируется / proc / sys / fs / inotify / max_queued_events. Помимо этого, вы получаете уведомление IN_Q_OVERFLOW - это хорошо, но вы по-прежнему находитесь в ситуации, когда вам может потребоваться время от времени повторное сканирование.
blucz
Ага, я недавно читал в очереди. Я думаю, что этот крайний случай будет зависеть от того, сколько файлов вы отслеживаете, а также от того, насколько важно отслеживать все изменения или некоторые из них могут быть пропущены. Но это хороший момент. Спасибо :)
Фарон
@blucz Мне было интересно, как разработчики ядра решают эти ситуации. Приятно знать, что они это делают, дает больше уверенности в дизайне и реализации.
n611x007
11

JNotify или FileMon от Microsoft.

Евгений
источник
8
JNotify был идеальным для меня, потому что мне нужна была кроссплатформенная совместимость. Я даже смог написать один сценарий bash, который работал в cygwin, mac и linux, предполагая только то, что JAVA_HOME был установлен правильно. Это было большим подспорьем при отладке проблем на машинах клиентов, когда они говорят: «Мой файл удален!» Я действительно могу посмотреть журнал и попытаться выяснить, как и когда это произошло.
cmyers
1
FileMon теперь называется ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU
10

Немного поздно, но ...

В Windows есть функция, аналогичная событиям OSX, благодаря которой вы можете отслеживать события, не запуская приложение. Журнал Windows USN Journal отслеживает все изменения файлов. Джеффри Рихтер (автор Advanced Windows) написал потрясающую статью с рабочими примерами для MSDN Journal. Обновление : статья теперь с archive.org, поскольку MSJ больше не в сети MS.

Документация MSDN для журналов изменений USN.

Журналы изменений USN, вероятно, лучше подходят, если вы создаете такие приложения, как инструменты резервного копирования или индексы, которым необходимо отслеживать целые тома.

Петер Крневич
источник
Разве USN Journal отличается, полагаясь на него, избегает ошибочного поведения FileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmes было говорить о ?
n611x007
4
Я давно не работал с этим, но он не использует FileSystemWatcher или FindFirstChangeNotification. Я начал писать наблюдатель событий Windows на Go, основанный на примерах Джеффри Рихтера. Судя по тому небольшому тесту, который я провел, он надежен и не пропускает ничего, как и другие события в OS X. Суть
Питер Крневич
@PeterKrnjevic Можете ли вы обновить ссылку на статью Джеффри Рихтера?
SOUser
@SOUser, из-за MS bitrot, ссылка на статью добавлена ​​с archive.org.
Peter Krnjevic
3

FileSystemWatcher () ненадежен в основном из-за того, что обработка ошибок для буфера наблюдателя более или менее неполная. Из-за отсутствия пути и подробной информации об обработке ошибок Microsoft не дает вам возможности восстановить или вручную опросить рабочий каталог.

JNotify для Windows также ненадежен, потому что эта ошибка ^ происходит от win32. JNotify использует win32. Итак, он ничем не отличается от FileSystemWatcher ().

Филлип Брэндон Холмс
источник
Размышляя о том, как разработать роли для решения этой проблемы типа «скорость» / «гонка» / «переполнение», я задавался вопросом, как ядра это сделали. Интересный. То же самое происходит с сетью и ведением журнала. У этой проблемы есть название?
n611x007
Да, это имя "ошибка". Ошибка (win32) осталась во всех операционных системах, созданных на сегодняшний день Microsoft. Это делает любую операционную систему Microsoft непригодной для решения типа просмотра файлов. Вы должны пойти * nix для этого. Иногда мне кажется, что они намеренно оставили это переполнение буфера в целях безопасности.
Филлип Брэндон Холмс
ха-ха ... да ... это название - намеренный кластерный кладж, чтобы файловая система Microsoft не могла быть намеренно отслежена. Это ошибка, которую они оставили из-за проблем с безопасностью.
Филлип Брэндон Холмс
1

Я немного поискал, мне кажется, я видел что-то подобное для Windows. Для .NET есть FileSystemWatcher . Это в основном для NT или XP и далее.

Фарон
источник
Обычно он доступен только в файловых системах NTFS, но не в FAT16, FAT32 или даже в новом exFAT.
Mastacheata