2017-10-12 149 views
2

我试图监视更改的文件夹。此文件夹包含我不想看的子文件夹。不幸的是,WatchService通知这些子文件夹的改变了我。我想这是因为这些文件夹更新的最后更改日期。WatchService排除的文件夹

于是,我就exlude他们:

WatchService service = FileSystems.getDefault().newWatchService(); 
workPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, 
      StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); 
try { 
    WatchKey watchKey = watchService.take(); 
    for (WatchEvent<?> event : watchKey.pollEvents()) { 
     @SuppressWarnings("unchecked") 
     WatchEvent<Path> ev = (WatchEvent<Path>) event; 
     Path fileName = ev.context(); 
     if (!Files.isDirectory(fileName)) { 
      logger.log(LogLevel.DEBUG, this.getClass().getSimpleName(), 
        "Change registered in " + fileName + " directory. Checking configurations."); 
      /* do stuff */ 
     } 
    } 
    if (!watchKey.reset()) { 
     break; 
    } 
} catch (InterruptedException e) { 
    return; 
} 

这不工作,虽然。上下文的结果路径是相对的,并且Files.isDirectory()无法确定它是目录还是文件。

有没有办法排除子文件夹?

回答

2

你可以尝试下面的代码片段。为了获得完整路径,您需要调用resolve()函数

Map<WatchKey, Path> keys = new HashMap<>(); 

    try { 
     Path path = Paths.get("<directory u want to watch>"); 
     FileSystem fileSystem = path.getFileSystem(); 
     WatchService service = fileSystem.newWatchService(); 

     Files.walkFileTree(path, new SimpleFileVisitor<Path>() { 
       @Override 
       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { 
        if (<directory you want to exclude>) { 
          return FileVisitResult.SKIP_SUBTREE; 
        } 

        WatchKey key = dir.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE); 
        keys.put(key, dir); 
        return FileVisitResult.CONTINUE; 
       } 
     }); 

     WatchKey key = null; 
     while (true) { 
      key = service.take(); 
      while (key != null) { 
       WatchEvent.Kind<?> kind; 
       for (WatchEvent<?> watchEvent : key.pollEvents()) { 
        kind = watchEvent.kind(); 
        if (OVERFLOW == kind) { 
         continue; 
        } 

        Path filePath = ((WatchEvent<Path>) watchEvent).context(); 
        Path absolutePath = keys.get(key).resolve(filePath); 

        if (kind == ENTRY_CREATE) { 
         if (Files.isDirectory(absolutePath, LinkOption.NOFOLLOW_LINKS)) { 
          WatchKey newDirKey = absolutePath.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE); 
          keys.put(newDirKey, absolutePath); 
         } 
        } 

       } 
       if (!key.reset()) { 
        break; // loop 
       } 
      } 
     } 
    } catch (Exception ex) { 
    } 
+0

谢谢。解决帮助。 'Path fileName = workPath.resolve(ev.context())' –