使用Java监视服务监视子文件夹



我正在使用watchKey侦听特定文件夹中的文件更改。

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",它只给我放文件的路径,而不是文件名。

如何获取文件名?

为什么没有在子文件夹中创建/修改文件名的原因是Stephen C在他的回答中给出的。

下面是一个简单的例子,说明如何注册目录子目录,以观察它们中您感兴趣的事件:

/**
 * 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教程:观察目录的变化。在那里你可以找到很好的解释和示例的源代码。

您将对这个如何监视目录(或目录树)以查看文件更改的示例特别感兴趣:

我上面提供的方法取自这个例子(为简洁起见省略了一些部分)。

你只看到"E:/Raja/Test"而不是"E:/Raja/Test/Foo.txt"(例如)的事件的原因是你只在服务中注册了"E:/Raja"目录。这意味着您将看到目录及其直接成员上的事件。"E:/Raja/Test"是目录的一个成员,你得到的事件表明它已被更改…当文件被添加到其中

解决方案是注册"E:/Raja"的所有子目录…

我知道这很难看,希望有人有更好的答案,但你可以创建一个列表,每个子文件夹中的每个文件和最后修改时间。

当您收到ENTRY_CREATE或ENTRY_DELETE时,将文件夹与您的列表进行比较,以找出哪个文件被更改

当您收到一个ENTRY_MODIFY时,比较上次修改的时间

记得更新你的列表

相关内容

  • 没有找到相关文章

最新更新