Мониторинг изменений файловой системы через Java
Я хочу отслеживать изменения с выбранными каталогами в моей системе через Java. Я имею некоторое представление о watchservice в java 7. Но watchservice возвращает только имя каталога, в котором происходит событие изменения (MODIFY, DELETE). С другой стороны, мне нужна вся информация об изменениях, например, о пользователе, который внес изменения, о времени, в которое произошли изменения и т. Д.
Это что-то вроде желания читать журналы изменений в файловой системе NTFS. Есть ли другой способ, доступный в Java для записи таких изменений асинхронно? ...
Заранее спасибо.
4 ответа
Не уверен, что у вас есть возможность добавлять библиотеки импорта в ваш проект, но у commons-io есть FileAlterationObserver, который может удовлетворить ваши потребности:
http://commons.apache.org/io/api-release/org/apache/commons/io/monitor/FileAlterationObserver.html
Если вы используете java7, взгляните на java.nio.file.FileSystem и WatchService
для получения дополнительной информации обратитесь к руководству Oracle
Вы можете найти пример программирования событий: Google Guava EventBus и Java 7 WatchService полезны. Я пытаюсь сделать асинхронный просмотр файлов, и, вероятно, буду использовать некоторые производные этого.
Или, если вы хотите пропустить прямое управление WatchService, попробуйте файл Camel endopoint.
Если вы просто хотите получать уведомления, когда что-то происходит, вы можете использовать одну из библиотек, размещенных в ответах.
Если вы хотите сделать это самостоятельно, используя небольшой пример (и вы ограничены Windows), взгляните на эту статью о собственном интерфейсе Java. Используя функцию ReadDirectoryChanges, вы можете принимать асинхронные уведомления.
Если вам действительно нужно знать, КТО внес эти изменения, тогда... удачи! Насколько я знаю (и только для Windows), это не простая тема, потому что Windows не сохраняет эту информацию. Вы можете получить его через JNI с помощью Object Auditing, но вы должны включить его, и это немного замедлит работу вашей системы. Посмотрите на этот пост для некоторых деталей.