2015-07-02 7 views
0

Мне нужно отслеживать заданный каталог и все его подкаталоги для изменений (особенно добавление файлов и каталогов).Рекурсивно контролировать каталог и все подкаталоги в 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); 

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

FYI: Я также попытался JNotify, но он продолжает говорить java.lang.UnsatisfiedLinkError: no jnotify_64bit in java.library.path

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

+1

Я думаю, на это уже был дан ответ: http://stackoverflow.com/questions/17850940/watching-a-directory-and-sub-directory-for-create-modify-and-changes-in-java – fishi

ответ

-1

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

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

0

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

Что касается вашего UnsatisfiedLinkError, см. How to set the java.library.path from Eclipse. Я разместил jnotify_64bit.dll (Windows здесь) в базовом каталоге моего проекта, и он сработал. YMMV.

Смежные вопросы