如何在应用程序启动时让监视服务处理目录中的任何文件?
我已经运行了应用程序,但我注意到只处理了目录中删除的新文件,但忽略了从头开始存在的文件。
答案 0 :(得分:4)
WatchService只处理文件系统中的更改。已经存在的文件尚未更改,因此WatchService无法获取这些文件。 您必须递归遍历所有文件和目录才能获得文件的初始“视图”:
Files.walkFileTree(basePath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
// do something with the file
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
// do something with the directory
return FileVisitResult.CONTINUE;
}
});
然后,WatchService会在初始化之后发生所有更改。
答案 1 :(得分:2)
我在这里有相同的用例,我很惊讶我在网上找不到这种常见情况。我在下面的方法中看到了一些问题。假设我们使用walkTree方法扫描目录中的现有文件,然后为WatchService注册目录。
1. Files.walkTree(...);
2. Path dir = Paths.get(...);
3. WatchService watcher = dir.getFileSystem().newWatchService();
4. dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
5. // other logic
第1行刚刚结束之后和第5行开始之前创建的文件怎么样?我只是将它作为一个粗略的界限,使讨论更容易。丢失文件的机会窗口的真正边界可能更广泛。
答案 2 :(得分:0)
WatchService 监视注册对象的某些类型的更改和事件。当我们正在侦听的事件发生时,将调用代码。我们可能会监视文件的创建,删除或修改:
如果使用
WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
…仅报告新创建的文件。为了观察已经创建的文件,请使用:
StandardWatchEventKinds.ENTRY_MODIFY