Как отслеживать изменения файлов на сетевых дисках?
из того, что я вижу, сетевые сопоставленные диски отображаются как подпапки папки /Volumes.
Как правильно получить обновления изменений файлов (удалить/создать / обновить) из этой папки?
будет ли /dev/fsevents работать для этого?
Как Finder знает об изменениях?
2 ответов
вы правы, OS X монтирует сетевые диски в / Volumes
способ получить обновления изменений файлов-использовать API событий файловой системы. Это API на основе C, где вы будете следить за всеми изменениями в определенных каталогах (или даже /
).
вы бы создать поток с FSEventStreamCreate
и начиная с FSEventStreamScheduleWithRunLoop
будьте готовы копаться в заголовочном файле, поскольку на нем больше документации, как в справочная документация
из того, что я могу сказать, Finder, вероятно, использует какой-то внутренний API или очереди ядра которые сложнее настроить, чем API более высокого уровня FSEvents.h
есть хороший графический интерфейс, чтобы помочь вам увидеть, как все события приходят. Это называется fseventer по fernlightning (еще не готов Йосемити)
можно использовать fswatch
, который я нахожу easest для установки через homebrew
. И, да, он использует FSEvents. Тогда вы просто делаете:
fswatch /Volumes/MUSIC
здесь MUSIC
- музыкальный сервер на основе Samba в моей сети.
вот как это выглядит в действии... сначала я показываю смонтированные Тома (и эта музыка основана на Samba) в верхнем окне, затем я запускаю fswatch
в левом нижнем окне, затем я делаю изменения в файловой системе в верхнем окне, и вы можете видеть, как они происходят в Finder, а также увидеть в левом нижнем окне, что fswatch
отслеживает все события.
вы можете также использовать его для взаимодействия с другой программой при обнаружении такой (взято из fswatch
manpage):
вероятно, самый простой способ трубы fswatch
к другой программе для того чтобы ответить к событию
использование команды xargs:
$ fswatch -0 [opts] [paths] | xargs -0 -n 1 -I {} [command]
fswatch -0 разделит записи с помощью NUL характер.
xargs -0 разделит записи, используя символ NUL. Это необходимо для правильного соответствия импеданс с fswatch.
xargs-n 1 вызовет команду каждой записи. Если вы хотите сделать это каждые X записей, то используйте xargs-n x.
xargs-I {} заменит вхождения {} в команде с проанализированным аргументом. Если выполняемой команде не требуется имя пути к событию, просто удалите эту опцию. Если вы предпочитаете использовать другую строку замены, замените {} своей.