Используя библиотеку 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 папок). Я постараюсь и дальше использовать простую (и ошибочную) эвристику
Если он содержит точку ('.'), Это файл.
Я буду публиковать обновления, если я столкнусь с чем-то более сложным...