Я пытался реализовать службу, которая отслеживает каталог на предмет изменений в файлах (создание, удаление, изменение) с помощью java.nio.file.WatchService
. Это работает довольно хорошо, за исключением случаев, когда я пытаюсь удалить папку "root", в которой зарегистрирован WatchService. В этом случае не генерируется событие или исключение, и служба продолжает работать.
В качестве подтверждения концепции я использую следующий код:
import java.nio.file._
import java.util.concurrent.TimeUnit
object FileWatcher {
def main(args: Array[String]) = {
val path : Path = Paths.get("/somefolder");
val watchService = FileSystems.getDefault.newWatchService
val WATCH_KINDS = Array[WatchEvent.Kind[_]](
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.OVERFLOW
)
path.register(watchService, WATCH_KINDS)
while ({true}) try {
val key = watchService.take
import scala.collection.JavaConversions._
for (event <- key.pollEvents) {
val kind = event.kind
println(kind.toString)
}
key.reset()
} catch {
case x: Throwable =>
println(s"${x.getMessage}")
}
}
}
Приведенный выше код без проблем обнаруживает ENTRY_CREATE
, ENTRY_MODIFY
, ENTRY_DELETE
события.
Однако в момент удаления /somefolder
ничего не происходит, и служба продолжает работать. Повторное создание /somefolder
не заставит WatchService возобновить обнаружение событий на /somefolder
. Нет исключений.
Как я могу обнаружить эту ситуацию? В настоящее время FileWatcher продолжает работать, и нет никакого способа узнать, работает ли он по-прежнему / полезно / обнаруживает события.