Рекурсивно отслеживать каталог и все подкаталоги в java

Мне нужно отслеживать данный каталог и все его подкаталоги на наличие изменений (особенно добавление файлов и каталогов).

Мой текущий код выглядит следующим образом

Path watchFolder = Paths.get("D:/watch");
    WatchService watchService = FileSystems.getDefault().newWatchService();
    watchFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
            watchFolder.register(watchService, StandardWatchEventKinds.ENTRY_DELETE);
            watchFolder.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);

    boolean valid = true;
    do {
        WatchKey watchKey = watchService.take();

        for (WatchEvent event : watchKey.pollEvents()) {
            WatchEvent.Kind kind = event.kind();
            if (StandardWatchEventKinds.ENTRY_CREATE.equals(kind)) {
                String fileName = event.context().toString();
                System.out.println("File Created:" + fileName);
            }
        }
        valid = watchKey.reset();

    } while (valid);

Этот код может отслеживать только изменения родительского каталога. Если я добавлю каталог в родительский каталог, он сможет запустить событие. Но если я добавлю файл в подкаталог, он не сможет его обнаружить.

К вашему сведению: я также пробовал JNotify, но он продолжает говорить java.lang.UnsatisfiedLinkError: no jnotify_64bit in java.library.path

Есть ли лучшее решение, чем это?


person Sunil Kumar B M    schedule 02.07.2015    source источник
comment
Я думаю, что здесь уже был дан ответ: stackoverflow.com/questions/17850940/   -  person fishi0x01    schedule 02.07.2015


Ответы (2)


Я хотел бы призвать вас еще раз попробовать jnotify . Он хорошо сообщает об изменениях в подкаталогах и выглядит более эффективным с точки зрения ресурсов, чем создание нагрузки WatchKey для каждого каталога, который вы хотите отслеживать.

Что касается вашего UnsatisfiedLinkError, см. Как установить java.library.path из Eclipse. Я поместил jnotify_64bit.dll (здесь Windows) в базовый каталог моего проекта, и это сработало. YMMV.

person f_puras    schedule 08.07.2015

Из вашего вопроса я предполагаю, что ваше требование состоит в том, чтобы опросить каталог, и когда появится какой-либо файл, что-то сделать, то есть вызвать какой-то метод.

Если я правильно понял, вам следует попробовать JPoller, который снижает сложность и делает то, что вам нужно. Он также позволяет вам установить интервал опроса и предоставляет несколько методов обратного вызова.

person JavaYouth    schedule 02.07.2015