2013-05-17 1 views
11

Я использую watchKey для прослушивания изменения файла в определенной папке.Монитор вложенных папок с сервисом часовых поясов Java

Path _directotyToWatch = Paths.get("E:/Raja"); 
WatchService watcherSvc = FileSystems.getDefault().newWatchService(); 
WatchKey watchKey = _directotyToWatch.register(watcherSvc, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 

while (true) { 
    watchKey=watcherSvc.take(); 
    for (WatchEvent<?> event: watchKey.pollEvents()) { 
     WatchEvent<Path> watchEvent = castEvent(event); 
     System.out.println(event.kind().name().toString() + " " + _directotyToWatch.resolve(watchEvent.context())); 
     watchKey.reset(); 
    } 
} 


Она работает хорошо для меня. Если я изменяю файл в папке raja, он дает мне имя файла с контуром. Но, когда я помещаю некоторые файлы в подпапки, такие как «E:/Raja/Test», он дает мне только путь, куда я его помещаю, а не имя файла.

Как получить имя файла?

+2

это дубликат http://stackoverflow.com/questions/5608234/how-can-i-watch-subdirectory-for-changes-with-watch-service-java –

ответ

0

Я знаю, что это некрасиво, надеюсь, кто-то лучший ответ, но вы можете:

Решение 1:

Создать список каждого файла в каждой подпапке, и там последний раз измененными.

Когда вы получаете ENTRY_CREATE или ENTRY_DELETE сравнить папку в список, чтобы выяснить, какой файл был изменен

Когда вы получаете ENTRY_MODIFY сравнить последнее изменение раза.

Не забудьте обновить свой список.

Edit: Как предложение приемлемо C# обрабатывает файл наблюдател вещь лучше

+2

Решение 2 похоже на высказывание вашим 5 чтобы узнать, как скейтборд, потому что он не может ездить на велосипеде. Вряд ли решение требует обучения. –

+0

Нет решения 2, как сказать вашему 5-летнему ребенку, чтобы наклониться, как кататься на скейтборде, потому что он хочет велосипед с 4 колесами, чтобы он мог поместиться в свой книжный мешок, кататься в стоячем положении и хранить в своем школьном шкафчике. Я сделал файловые файлы в java и C#. C# просто делает это лучше – Nick

+3

Возможно, C# делает это лучше, но OP, возможно, нужно будет работать с Java, поэтому использование C# не будет решением. Я думаю, что это предложение, а не решение. –

7

Причина вы видите только событие для "E:/Raja/Test", а не «E:/Raja/Test/Foo. txt "(например) заключается в том, что вы только зарегистрировали каталог« E:/Raja »с помощью службы. Это означает, что вы увидите события в каталоге и его ближайших членов. «E:/Raja/Test» является членом каталога, и вы получаете события, чтобы сказать, что было изменено ... когда файлы добавлены к нему.

Решение состоит в том, чтобы зарегистрировать все поддиректории «E:/Raja», а также ... так далеко от иерархии каталогов, как вам нужно.

+1

Если он регистрирует E:/Raha и E:/Raha/Test, я думаю, что он получит два события, если E: /Raja/Test/Foo.txt будет создан. – Nick

+2

Да, он будет. Но дело не в этом. Дело в том, что событие от наблюдателя на E:/Raha/Test даст ему событие CREATE полный путь к созданному файлу, но другой будет событием MODIFY, указав путь к директории, которая была изменена. (ОК ... я иду из памяти ...) –

13

Причина почему вы не получаете имя файла, созданного/модифицирована внутри вложенной задается Stephen C в его answer.

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

/** 
* Register the given directory, and all its sub-directories, with the WatchService. 
*/ 
private void registerAll(final Path start) throws IOException { 
    // register directory and sub-directories 
    Files.walkFileTree(start, new SimpleFileVisitor<Path>() { 

     @Override 
     public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) 
      throws IOException { 
       dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 
       return FileVisitResult.CONTINUE; 
     } 

    }); 

} 

Проверьте официальный Java Tutorials : Watching a Directory for Changes. Там вы можете найти очень хорошие объяснения и примеры с исходным кодом.

В частности, вам будет интересен этот пример того, как смотреть каталог (или дерево каталогов) для изменения файлов: WatchDir.

Метод, приведенный выше, был взят из этого примера (для краткости опущены некоторые части).
Прочтите учебник для деталей.