Как посмотреть полную файловую систему на предмет изменений в Java?

Описание проблемы
Я бы хотел посмотреть полную файловую систему на предмет изменений. Я говорю о рекурсивном наблюдении за изменениями в каталоге. Таким образом, при просмотре каталога (или всей файловой системы) также необходимо фиксировать все изменения в подкаталогах. Приложение должно иметь возможность отслеживать все изменения, получая уведомления.

WatchService Java не подходит
Ява уже имеет WatchService функция, которая позволяет отслеживать каталог на предмет изменений. Проблема, однако, в том, что, насколько я знаю, это не рекурсивный процесс, поэтому вы не можете использовать его для отслеживания всех изменений в корневом каталоге файловой системы.

Просмотр всех подкаталогов в явном виде
Решение, о котором я подумал, - это явно зарегистрировать каждый каталог внутри указанного корневого каталога. Однако проблема заключается в том, что обход и регистрация этих каталогов очень дороги в системе с более чем миллионом подкаталогов. Это потому, что система должна была бы рекурсивно пройти всю файловую систему, чтобы зарегистрировать только все каталоги в первую очередь. Влияние производительности на эту функцию будет слишком большим, если это возможно без сбоя приложения.

Логическое решение
Я бы предположил, что операционная система будет запускать / вызывать какое-то событие, когда в файловой системе что-то меняется, что приложение может слушать. Я, однако, пока не нашел ничего подобного. Это позволило бы приложению прослушивать все изменения без необходимости явной регистрации всех подкаталогов. Таким образом, влияние производительности на такой метод будет минимальным.

Вопрос
Можно ли наблюдать за всей файловой системой или рекурсивно наблюдать за каталогом в Java, и как этого достичь?

3 ответа

Вопрос должен быть разбит на несколько:

  1. Как отслеживать файловые события на диске в определенной ОС
  2. Как использовать этот механизм в Java

Ответ на первый вопрос заключается в том, что подходы разные. В Windows существуют функции API Windows, которые позволяют вам это делать (и известный класс FileSystemWatcher в.NET Framework является своего рода оболочкой для этого набора функций API). Более надежный метод для Windows - создать или использовать предварительно созданный драйвер фильтра файловой системы. В Linux существует inotify. В MacOS X существует несколько подходов (где-то был вопрос по этой теме), ни один из которых не является универсальным или всегда доступным. Также все подходы, кроме драйвера фильтра файловой системы, хороши только для уведомления после того, как событие произошло, но они не позволяют вам перехватить и отклонить запрос (AFAIK, я могу ошибаться здесь).

Что касается второго вопроса, то, похоже, не существует универсального решения, которое охватывало бы все или большинство вариантов, которые я упоминал выше. Вам нужно будет сначала выбрать механизм для каждой ОС, а затем найти несколько оболочек для Java, чтобы использовать эти механизмы.

Вот пример, чтобы посмотреть каталог (или дерево) на предмет изменений в файле

Пожалуйста, найдите пример https://github.com/syncany/syncany/blob/59cf87c72de4322c737f0073ce8a7ddd992fd898/syncany-lib/src/main/java/org/syncany/operations/watch/RecursiveWatcher.java

Даже вы можете отфильтровать наш каталог, который вы не хотите смотреть

Другие вопросы по тегам