当应用程序启动时,如何让监视服务处理目录中的所有文件?
我已经运行了应用程序,但是我注意到只有在目录中放入新文件时才会处理,而从一开始就存在的文件被忽略了。
当应用程序启动时,如何让监视服务处理目录中的所有文件?
我已经运行了应用程序,但是我注意到只有在目录中放入新文件时才会处理,而从一开始就存在的文件被忽略了。
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
那么,在第一行完成后,而在第五行开始之前创建的文件怎么办?我只是使用这个粗略的边界使讨论更容易。 文件丢失的机会窗口的真正边界可能更宽。
如果使用
WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
...只有新创建的文件才会被报告。如果要观察已经创建的文件,请使用:
StandardWatchEventKinds.ENTRY_MODIFY