如何让监视服务在应用程序启动时处理目录中的任何文件?
我已经运行了应用程序,但我注意到只处理目录中删除的新文件,但忽略从一开始就存在的文件。
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 获取。
我在这里有相同的用例,我很惊讶我在网上没有发现对于这种常见场景有多大用处。我在以下方法中看到了一些问题。假设我们使用 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 行开始之前创建的文件呢?我只是将其用作粗略的界限,以使讨论更容易。文件丢失机会的窗口的真正边界可能更宽。
WatchService 监视注册对象的某些类型的更改和事件。当我们正在监听的事件发生时,代码会被调用。我们可能会监控文件的创建、删除或修改:
如果使用
WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
… 只会报告新创建的文件。为了观察已经创建的文件,使用:
StandardWatchEventKinds.ENTRY_MODIFY