Я рекурсивно просматриваю каталог (и, следовательно, все его подкаталоги и файлы) на предмет изменений.
Кажется, если я создаю или удаляю каталог или файл в подкаталоге корневого каталога длясмотреть, что у Path, который включен в экземпляр WatchEvent, который каждый получает (через context ()), нет родителя, и поэтому rootDirToWatch.resolve(event.context())
не возвращает путь, который мне нравится иметь.
Например:
* Наблюдается 1008 *, затем я создаю новый каталог в /home/johannes/test/foo/bar
с именем baz
, я получаю новый экземпляр Path, который /home/johannes/test/baz
вместо /home/johannes/test/foo/bar/baz
Любые предложениячто не так?
Я просто использую посетителя для просмотра всех подкаталогов в определенном корневом каталоге (просмотр всего каталога со всеми его потомками):
@Override
public FileVisitResult preVisitDirectory(final Path pDir, final BasicFileAttributes pAttrs)
throws IOException
{
checkNotNull(pDir);
checkNotNull(pAttrs);
pDir.register(mWatcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
return FileVisitResult.CONTINUE;
}
Редактировать: Я думаюМне действительно нужно использовать посетителя или, по крайней мере, зарегистрировать все подкаталоги у наблюдателя.Поскольку WatchEvent возвращает относительный путь, понятно, почему он ведет себя так, как описано, но я не хочу еще раз проходить по каталогу, чтобы найти путь от корневого каталога для просмотра к добавленному / удаленному / измененному файлу где-то выше в иерархии.
Редактировать: Я нашел решение («индексация» ключей): http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java