Не думаю, что такие вопросы не по теме. Вопрос касается API ОС, который сильно отличается от любого инструмента / библиотеки программного обеспечения. Может быть, это можно сформулировать по-другому, например, как получить уведомление в приложении Windows, когда конкретный файл / файлы изменяются.
balki
1
Проголосовали за повторное открытие: вопрос запрашивает сопоставимую альтернативу API конкретной операционной системы и образно звучит для меня как «Я из Англии, где я использую вилку, чтобы есть пищу, в Японии, какую посуду я использую аналогичным образом? " Принятый ответ, использующий эту аналогию, - «использовать палочки для еды».
Все они слегка отличаются друг от друга, и все они имеют сомнительную надежность в крайних случаях. В общем, вы не можете полагаться на эти API для получения полного представления обо всех изменениях в 100% случаев. Большинство людей, использующих мониторинг файловой системы, сочетают его с периодическим сканированием, чтобы компенсировать потерянную или неполную информацию из push api.
Не могли бы вы процитировать «сомнительную надежность в крайнем случае для inotify?»
Фарон,
18
Если потребитель api наблюдателя fs медленнее при чтении событий, чем какой-либо другой процесс при их создании, ядру необходимо либо задержать изменения файловой системы в другом (возможно, более высоком приоритетном) процессе, либо разрешить неограниченное увеличение буфера. Глубина буфера inotify (как описано на странице руководства) контролируется / proc / sys / fs / inotify / max_queued_events. Помимо этого, вы получаете уведомление IN_Q_OVERFLOW - это хорошо, но вы по-прежнему находитесь в ситуации, когда вам может потребоваться время от времени повторное сканирование.
blucz
Ага, я недавно читал в очереди. Я думаю, что этот крайний случай будет зависеть от того, сколько файлов вы отслеживаете, а также от того, насколько важно отслеживать все изменения или некоторые из них могут быть пропущены. Но это хороший момент. Спасибо :)
Фарон
@blucz Мне было интересно, как разработчики ядра решают эти ситуации. Приятно знать, что они это делают, дает больше уверенности в дизайне и реализации.
JNotify был идеальным для меня, потому что мне нужна была кроссплатформенная совместимость. Я даже смог написать один сценарий bash, который работал в cygwin, mac и linux, предполагая только то, что JAVA_HOME был установлен правильно. Это было большим подспорьем при отладке проблем на машинах клиентов, когда они говорят: «Мой файл удален!» Я действительно могу посмотреть журнал и попытаться выяснить, как и когда это произошло.
В Windows есть функция, аналогичная событиям OSX, благодаря которой вы можете отслеживать события, не запуская приложение. Журнал Windows USN Journal отслеживает все изменения файлов. Джеффри Рихтер (автор Advanced Windows) написал потрясающую статью с рабочими примерами для MSDN Journal. Обновление : статья теперь с archive.org, поскольку MSJ больше не в сети MS.
Журналы изменений USN, вероятно, лучше подходят, если вы создаете такие приложения, как инструменты резервного копирования или индексы, которым необходимо отслеживать целые тома.
Разве USN Journal отличается, полагаясь на него, избегает ошибочного поведения FileSystemWatcher| FindFirstChangeNotificationPhillipBrandonHolmes было говорить о ?
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 и далее.
Ответы:
См. API FindFirstChangeNotification или аналог .NET FileSystemWatcher
источник
Если вы используете .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.
источник
взгляните на это: inotify-win, порт инструмента inotifywait для Windows
а также это: inotify-tools
источник
JNotify или FileMon от Microsoft.
источник
Немного поздно, но ...
В Windows есть функция, аналогичная событиям OSX, благодаря которой вы можете отслеживать события, не запуская приложение. Журнал Windows USN Journal отслеживает все изменения файлов. Джеффри Рихтер (автор Advanced Windows) написал потрясающую статью с рабочими примерами для MSDN Journal. Обновление : статья теперь с archive.org, поскольку MSJ больше не в сети MS.
Документация MSDN для журналов изменений USN.
Журналы изменений USN, вероятно, лучше подходят, если вы создаете такие приложения, как инструменты резервного копирования или индексы, которым необходимо отслеживать целые тома.
источник
FileSystemWatcher
|FindFirstChangeNotification
PhillipBrandonHolmes было говорить о ?FileSystemWatcher () ненадежен в основном из-за того, что обработка ошибок для буфера наблюдателя более или менее неполная. Из-за отсутствия пути и подробной информации об обработке ошибок Microsoft не дает вам возможности восстановить или вручную опросить рабочий каталог.
JNotify для Windows также ненадежен, потому что эта ошибка ^ происходит от win32. JNotify использует win32. Итак, он ничем не отличается от FileSystemWatcher ().
источник
Я немного поискал, мне кажется, я видел что-то подобное для Windows. Для .NET есть FileSystemWatcher . Это в основном для NT или XP и далее.
источник
попробуйте библиотеку уведомлений о файлах Java
источник