3

如何让监视服务在应用程序启动时处理目录中的任何文件?

我已经运行了应用程序,但我注意到只处理目录中删除的新文件,但忽略从一开始就存在的文件。

4

3 回答 3

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 获取。

于 2012-02-23T01:27:18.533 回答
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 行开始之前创建的文件呢?我只是将其用作粗略的界限,以使讨论更容易。文件丢失机会的窗口的真正边界可能更宽。

于 2013-05-21T04:00:53.757 回答
0

WatchService 监视注册对象的某些类型的更改和事件。当我们正在监听的事件发生时,代码会被调用。我们可能会监控文件的创建、删除或修改:

  • ENTRY_CREATE
  • ENTRY_DELETE
  • ENTRY_MODIFY

如果使用

WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);

… 只会报告新创建的文件。为了观察已经创建的文件,使用:

StandardWatchEventKinds.ENTRY_MODIFY
于 2019-07-13T18:37:04.940 回答