Используя библиотеку JNotify, как определить, был ли удаленный файл файлом или каталогом?

Для тех, кто не знаком с JNotify, это библиотека, которая предоставляет простой способ мониторинга событий в каталоге.

Например, когда файл удаляется в выбранной папке, вызывается метод fileDeleted вместе с несколькими параметрами. Вот пример метода fileDeleted:

public void fileDeleted(int wd, String rootPath, String name) {
   print("deleted " + rootPath + " : " + name);
}

Теперь я хотел бы знать, был ли удаленный файл файлом или каталогом. Мой обычный подход - создать новый объект File с заданным путем и использовать методы isFile() и isDirectory().

Однако, так как этот файл уже удален, эти методы всегда возвращают false.

Итак, вот мой конкретный вопрос: у меня есть путь к удаленному файлу или каталогу, как я могу узнать, был ли это файл или каталог? Есть ли обходной путь к этому? Какую практику лучше делать здесь?

Заранее спасибо.

3 ответа

Решение

Я предлагаю использовать для этого лучший API, например Commons IO. Он имеет это различие в своем интерфейсе org.apache.commons.io.monitor.FileAlterationListener и его методы onFile...(), onDirectory...(), В качестве альтернативы, и это, вероятно, лучший подход, используйте новую стандартную функцию для этого, которая поставляется с Java 7, WatchService, как обсуждалось здесь.

Насколько велика структура каталогов, на которую вы смотрите?

Мой первый инстинкт - построить внутреннее представление структуры каталогов, используя некоторый простой алгоритм обхода графа, а затем выполнять поиск каждый раз, когда что-то удаляется, чтобы выяснить, что это было.

<edit>
Если вы знаете, что ваша структура каталогов является строгим деревом, вы можете использовать простую рекурсию для обхода файловой системы и создания карты Fileс или Stringс boolean, так что вы можете сделать легкий поиск. Затем, как только вы построите карту, ее будет легко поддерживать с помощью событий JNotify.
<edit/>

даже для каталогов среднего размера, я думаю, это можно сделать довольно быстро. Для чего это? Может ли быть другой способ достижения той же цели?

Я сталкиваюсь с той же проблемой. Тем не менее, насколько я понимаю, Java WatchService не позволяет контролировать подкаталоги, поэтому я не могу его использовать (задача состоит в том, чтобы отслеживать изменения в структуре, содержащей ~40K папок). Я постараюсь и дальше использовать простую (и ошибочную) эвристику

Если он содержит точку ('.'), Это файл.

Я буду публиковать обновления, если я столкнусь с чем-то более сложным...

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