Используя библиотеку JNotify, как узнать, был ли удаленный файл файлом или каталогом? - PullRequest
3 голосов
/ 25 ноября 2011

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

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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 26 ноября 2011

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

2 голосов
/ 25 ноября 2011

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

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

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

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

0 голосов
/ 12 августа 2015

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

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

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

...