14

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”之类的子文件夹中时,它只给了我放置它的路径,而不是文件名。

如何获取文件名?

4

3 回答 3

21

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 教程:查看更改目录。在那里你可以找到非常好的解释和源代码示例。

特别是您会对这个如何监视目录(或目录树)以更改文件的示例感兴趣:WatchDir.java

我上面提供的方法取自这个例子(为了简洁省略了一些部分)。
阅读教程了解详细信息。

于 2013-05-17T15:47:56.923 回答
10

您只看到“E:/Raja/Test”事件而不是“E:/Raja/Test/Foo.txt”(例如)的原因是您只注册了“E:/Raja”目录与服务。这意味着您将在目录及其直接成员上看到事件。“E:/Raja/Test”是该目录的一个成员,并且您收到事件说它已被更改......当文件被添加到它时。

解决方案是同时注册“E:/Raja”的所有子目录......尽可能地沿着目录层次结构向下移动。

于 2013-05-17T15:36:13.250 回答
0

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

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

当您收到 ENTRY_MODIFY 比较最后修改时间。

记得更新你的清单。

于 2013-05-17T14:35:50.070 回答