События API WatchService, изменение редактируемых файлов (word, odt,….)

#java #watchservice

#java #watchservice

Вопрос:

Я использую следующий код для автоматизации папки, чтобы получать события создания, модификации и удаления файлов

 public static void main(String[] args){

    try {
        Path dir = Paths.get("D:/Temp/");

        WatchService watcher = FileSystems.getDefault().newWatchService();

        dir.register(watcher,  StandardWatchEventKinds.ENTRY_CREATE, 
                StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); 

        WatchKey key;

        while ((key = watcher.take())!=null){


            for (WatchEvent<?> event : key.pollEvents()) {

                WatchEvent.Kind<?> kind = event.kind();

                @SuppressWarnings("unchecked")
                WatchEvent<Path> ev = (WatchEvent<Path>) event;
                Path fileName = ev.context();

                if(kind==StandardWatchEventKinds.ENTRY_CREATE){

                    System.out.println("New File Added, file Name "   fileName);
                }

                if(kind==StandardWatchEventKinds.ENTRY_DELETE){

                    System.out.println("File Deleted "   fileName);
                }

                if (kind == StandardWatchEventKinds.ENTRY_MODIFY ){

                    System.out.println("File Modified "   fileName);
                }
            }

            boolean valid = key.reset();
            if (!valid) {
                break;
            }
        }

    } catch (IOException ex) {
        System.err.println(ex);
    }
}
  

}

Когда я редактирую файл word ( TEST.docx ) в папке, которая отслеживается и сохраняется с изменениями, отображается следующий результат события:

 New File Added, file Name ~$TEST.docx
File Modified ~$TEST.docx
New File Added, file Name ~WRD0000.tmp
File Modified ~WRD0000.tmp
File Deleted TEST.docx
New File Added, file Name ~WRL0001.tmp
File Deleted ~WRD0000.tmp
New File Added, file Name TEST.docx
File Modified TEST.docx
File Modified ~WRL0001.tmp
New File Added, file Name ~WRD0002.tmp
File Modified ~WRD0002.tmp
File Deleted TEST.docx
New File Added, file Name ~WRL0003.tmp
File Deleted ~WRD0002.tmp
New File Added, file Name TEST.docx
File Modified TEST.docx
File Modified ~WRL0003.tmp
File Deleted ~WRL0003.tmp
File Deleted ~WRL0001.tmp
File Deleted ~$TEST.docx
  

Некоторые события вызваны временными файлами, которые создаются приложением Word в процессе редактирования.

Есть ли какой-либо способ фильтровать события, чтобы получать только события из файла word ( TEST.docx ) и игнорировать события, происходящие из временных файлов?

Спасибо

Ответ №1:

В моем приложении я отфильтровываю их, просто добавляя условие if:

 ...
final Path changed = (Path) event.context();
WatchEvent.Kind<?> kind = event.kind();
if (changed.toString().startsWith("TEST.docx")) {
                    if(kind==StandardWatchEventKinds.ENTRY_CREATE){

                System.out.println("New File Added, file Name "   fileName);
            }

}
  

Насколько я знаю, WatchService отслеживает все зарегистрированные события (в вашем случае ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE) во всех файлах в папке. Другой способ — разветвление исходного кода WatchService, но я не вижу, какие преимущества это решение имело бы по сравнению с этим простым решением.

Комментарии:

1. Veli-Matti Sorvala. Спасибо за ваш ответ. Это решение, которое работает