2017-10-12 1 views
2

Ich versuche, einen Ordner für Änderungen zu sehen. Dieser Ordner enthält Unterordner, die ich nicht sehen möchte. Leider benachrichtigt mich der WatchService über Änderungen in diesen Unterordnern. Ich schätze das passiert, weil das letzte Änderungsdatum dieser Ordner aktualisiert wird. SoWatchService exclude Ordner

ich versuchte, sie 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; 
} 

Dies allerdings nicht funktioniert. Der resultierende Pfad des Kontexts ist relativ und Files.isDirectory() kann nicht bestimmen, ob es ein Verzeichnis oder eine Datei ist.

Gibt es eine Möglichkeit, die Unterordner auszuschließen?

Antwort

2

Sie können das folgende Code-Snippet versuchen. Um den vollständigen Pfad zu erhalten, müssen Sie die resolve() Funktion aufrufen

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

Vielen Dank. Entschlossenheit half. 'Pfad fileName = workPath.resolve (ev.context())' –