如何使用Java FileWatchService在子目录中注册文件更改?

时间:2019-04-10 10:36:19

标签: java windows java-8 file-watcher

我在Windows中具有以下文件夹和文件结构:

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

我已经写了一个标准的WatchService代码来监视文件夹结构中的任何更改。我面临的问题是,当我复制City1和City2文件夹并粘贴到相同位置(名称不同)时,watchservice会间歇性地捕获该文件夹中的文件。 例如,有时仅捕获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();
        }
    }
}

0 个答案:

没有答案