Как отслеживать изменения файлов в сетевых подключенных дисках?

Из того, что я вижу, сетевые диски отображаются как подпапки папки /Volumes.

Каков правильный способ обновления файлов изменений (удаление/создание/обновление) из этой папки?

Будет ли /dev/fsevents работать для этого?

Как Finder знает об изменениях?

Ответы

Ответ 1

Вы правы, OS X монтирует сетевые диски в /Volumes

Чтобы получить обновления смены файлов, используйте API событий файловой системы. Это API на основе C, где вы будете следить за всеми изменениями в конкретных каталогах (или даже /).

Вы создали бы поток FSEventStreamCreate и запустили его с помощью FSEventStreamScheduleWithRunLoop

Будьте готовы копаться в заголовочном файле, так как на нем больше документации, как в справочной документации

Из того, что я могу сказать, Finder, вероятно, использует некоторый внутренний API или очереди ядра, которые сложнее настроить, чем API более высокого уровня FSEvents.h

Есть приятный графический интерфейс, помогающий вам увидеть, как все события входят. Он называется fseventer by fernlightning (еще не готовый к использованию Йосемити)

Ответ 2

Вы можете использовать fswatch, который легче всего установить с помощью homebrew. И, да, он использует FSEvents. Тогда вы просто выполните:

fswatch /Volumes/MUSIC

где MUSIC - это музыкальный сервер на базе Samba в моей сети.

Вот как это выглядит в действии... сначала я показываю смонтированные тома (и что MUSIC на основе Samba) в верхнем окне, затем я начинаю fswatch в нижнем левом окне, а затем внося изменения в файловой системы в верхнем окне, и вы можете увидеть, как они происходят в Finder, а также в нижнем левом окне, что fswatch отслеживает все события.

enter image description here

Вы также можете использовать его для взаимодействия с другой программой всякий раз, когда обнаружены события, например (извлеченные из man-страницы fswatch):

Вероятно, самый простой способ передать 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 {} заменит вхождения {} в команде с анализируемым аргументом. Если    для команды, которой вы работаете, не требуется имя пути к событию, просто удалите эту опцию.    Если вы предпочитаете использовать другую заменяющую строку, замените {} на ваш.