获取使用监视服务创建的文件的位置



我正在使用WatchService监视文件夹及其子文件夹以查找创建的新文件。但是,在创建文件时,监视服务会提供所创建文件的名称,而不是其位置。有没有办法获取所创建文件的绝对/相对路径。

解决此问题的一种粗略方法是在所有子文件夹中搜索文件名,然后找到具有最新创建日期的文件名。有没有更好的方法可以做到这一点?

如果您在目录中注册WatchService dir,何时获取完整路径很简单:

// If the filename is "test" and the directory is "foo",
// the resolved name is "test/foo".
Path path = dir.resolve(filename);

它有效,因为WatchService只监视一个目录。如果要监视子文件夹,则必须注册新WatchServices

回答您的无格式评论(这将解决您的问题(

public static void registerRecursive(Path root,WatchService watchService) throws IOException { 
   WatchServiceWrapper wsWrapper = new WatchServiceWrapper();
   // register all subfolders 
   Files.walkFileTree(root, new SimpleFileVisitor<Path>() { 
      public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
         wsWrapper.register(watchService, dir);
         return FileVisitResult.CONTINUE; 
      } 
   });  
   wsWrapper.processEvents();
}
public class WatchServiceWrapper {
   private final Map<WatchKey,Path> keys;
   public WatchServiceWrapper () {
      keys = new HashMap<>();
   }
   public void register(WatchService watcher, Path dir) throws IOException {
      WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
      keys.put(key, dir);
   }
   public void processEvents() {
      for (;;) {
        // wait for key to be signalled
        WatchKey key;
        try {
            key = watcher.take();
        } catch (InterruptedException x) {
            return;
        }
        Path dir = keys.get(key);
        if (dir == null) {
            System.err.println("WatchKey not recognized!!");
            continue;
        }
        //get fileName from WatchEvent ev (code emitted)
        Path fileName = ev.context();
        Path fullFilePath = dir.resolve(fileName);
        //do some other stuff
      }
   }
}

相关内容

  • 没有找到相关文章

最新更新