WatchService排除文件夹

Moh-Aw:

我正在尝试查看文件夹中的更改。该文件夹包含我不想观看的子文件夹。不幸的是,WatchService通知我这些子文件夹的更改。我猜是因为这些文件夹的最后更改日期更新了。

所以我试图排除它们:

WatchService service = FileSystems.getDefault().newWatchService();
workPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
            StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
try {
    WatchKey watchKey = watchService.take();
    for (WatchEvent<?> event : watchKey.pollEvents()) {
        @SuppressWarnings("unchecked")
        WatchEvent<Path> ev = (WatchEvent<Path>) event;
        Path fileName = ev.context();
        if (!Files.isDirectory(fileName)) {
            logger.log(LogLevel.DEBUG, this.getClass().getSimpleName(),
                    "Change registered in " + fileName + " directory. Checking configurations.");
            /* do stuff */
        }
    }
    if (!watchKey.reset()) {
        break;
    }
} catch (InterruptedException e) {
    return;
}

但是,这不起作用。上下文的结果路径是相对的,Files.isDirectory()无法确定它是目录还是文件。

有没有办法排除子文件夹?

sayboras:

您可以尝试以下代码段。为了获得完整的路径,您需要调用resolve()函数

Map<WatchKey, Path> keys = new HashMap<>();

    try {
        Path path = Paths.get("<directory u want to watch>");
        FileSystem fileSystem = path.getFileSystem();
        WatchService service = fileSystem.newWatchService();

        Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                    if (<directory you want to exclude>) {
                            return FileVisitResult.SKIP_SUBTREE;
                    }

                    WatchKey key = dir.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
                    keys.put(key, dir);
                    return FileVisitResult.CONTINUE;
                }
        });

        WatchKey key = null;
        while (true) {
            key = service.take();
            while (key != null) {
                WatchEvent.Kind<?> kind;
                for (WatchEvent<?> watchEvent : key.pollEvents()) {
                    kind = watchEvent.kind();
                    if (OVERFLOW == kind) {
                        continue;
                    }

                    Path filePath = ((WatchEvent<Path>) watchEvent).context();
                    Path absolutePath = keys.get(key).resolve(filePath);

                    if (kind == ENTRY_CREATE) {
                        if (Files.isDirectory(absolutePath, LinkOption.NOFOLLOW_LINKS)) {
                            WatchKey newDirKey = absolutePath.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
                            keys.put(newDirKey, absolutePath);
                        }
                    }

                }
                if (!key.reset()) {
                    break; // loop
                }
            }
        }
    } catch (Exception ex) {
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章