Как зарегистрировать изменения файла в подкаталоге, используя Java FileWatchService? - PullRequest
0 голосов
/ 10 апреля 2019

У меня ниже папка и структура файлов в Windows:

-INDIA
  -City1
    -File1.txt
    -File12.txt
  -City2
    -File2.txt
    -File22.txt

Я написал стандартный код WatchService для мониторинга любых изменений в структуре папок.Проблема, с которой я сталкиваюсь, заключается в том, что когда я копирую папки City1 и City2 и вставляю их в одно и то же место (с разными именами), служба наблюдения периодически перехватывает файлы в папке.Например, иногда это захватывает File1.txt, только File12.txt, иногда просто File2.txt, File22.txt.Это случайно.

В идеале, с копией папок City1 и City2, 4 файла также создаются, и их нужно захватывать.Есть ли способ записать эти файловые события или зарегистрировать файлы в watchservice?

Заранее большое спасибо.

public void start() {

    WatchKey key;
    while (true) {
        try {
            while ((key = watchService.poll(500, TimeUnit.MILLISECONDS)) != null) {
                Path directory = keys.get(key);

                for (WatchEvent<?> event : key.pollEvents()) {
                    @SuppressWarnings("rawtypes")
                    WatchEvent.Kind kind = event.kind();
                    @SuppressWarnings("unchecked")
                    Path name = ((WatchEvent<Path>) event).context();
                    Path child = null;
                    String infileName = "";
                    if (name != null) {
                        child = directory.resolve(name);
                        infileName = child.toString();
                    }

                    if (kind == StandardWatchEventKinds.ENTRY_MODIFY || kind == StandardWatchEventKinds.ENTRY_CREATE) {
                        if (Files.isDirectory(child)) {
                            traverseAndRegisterDirectories(child);
                        } else {
                            LOGGER.debug("ENTRY_MODIFY or ENTRY_CREATE " + infileName);
                            fileWatcher.onNewFile(infileName);
                        }
                    } else if (kind == OVERFLOW) {
                        LOGGER.debug("OVERFLOW " + infileName);
                    }
                }

                // reset key and remove from set if directory no longer accessible
                boolean valid = key.reset();
                if (!valid) {
                    keys.remove(key);

                    // all directories are inaccessible
                    if (keys.isEmpty()) {
                        break;
                    }
                }
            }
        } catch (Exception ex) {
            LOGGER.error("Error", ex);
            sqlHelper.closeConnection();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...