2017-04-25 41 views
1

複数のフォルダを監視する必要があり、特定の処理を実行するイベントを受信したフォルダをk35とします。私はこのコードを試しました。複数のフォルダを監視しているJava

WatchService watchService = FileSystems.getDefault().newWatchService(); 
opexFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE); 
docupostFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE); 

    boolean valid = true; 
    do { 
     WatchKey watchKey = watchService.take(); 
     for (WatchEvent<?> event : watchKey.pollEvents()) { 
      WatchEvent.Kind kind = event.kind();     
      if (StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind())) {      
       String fileName = event.context().toString();     

       //here I want to khow the path of the folder that has 
       // received the ENTRY event 
       String pathToExplore = ??; 
       if (pathToExplore has some value) { 
       treatments; 
       } else { 
       other treatments; 
       } 

      } 
     } 
     valid = watchKey.reset(); 

    } while (valid); 
} 

これを行うことは可能ですか、それともフォルダごとにwatchServiceを作成する必要がありますか。

ありがとうございました。

答えて

1

WatchService.take()は、監視対象のディレクトリごとに異なる監視キーを返します。そして、あなたはWatchKey::watchable()メソッドから監視されたdirを得ることができます。

したがって、戻り値WatchKey::watchable()を調べると、このイベントのディレクトリがわかります。


WatchKey usualy一定のですか?

No. WatchKeyは定数ではありません。あなたはWatchKey watchKey = watchService.take();に電話をかけて取得しました。投稿したコードですでにそれを行っています。サンプルアプリケーションから

import java.io.IOException; 
import java.nio.file.*; 
import java.nio.file.attribute.BasicFileAttributes; 

public final class WatchServiceExample { 

    public static void main(String[] args) throws Exception { 
     //We'll use this watch service to monitor all directories we are interested in 
     final WatchService watchService = FileSystems.getDefault().newWatchService(); 

     //We'll use this directory for the test in order not to create junk in the system 
     final Path tempDirectory = Files.createTempDirectory("watch-service-example"); 
     System.out.println("Created temporary directory: " + tempDirectory.toAbsolutePath()); 

     for (int i = 0; i < 10; i++) { 
      final Path watchedDir = Files.createDirectory(tempDirectory.resolve("watched_" + i)); 
      System.out.println("Created watched directory: " + watchedDir.toAbsolutePath()); 
      watchedDir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE); 
     } 

     System.out.println("Initialization complete. When you create an entry in the watch dirs you'll be notified."); 
     while (true) { 
      final WatchKey watchKey = watchService.take(); 
      final Watchable watchable = watchKey.watchable(); 

      //Since we are registering only paths in teh watch service, the watchables must be paths 
      if (!(watchable instanceof Path)) { 
       throw new AssertionError("The watchable should have been a Path"); 
      } 

      final Path directory = (Path) watchable; 
      System.out.println("Processing events for watched directory: " + directory); 

      for (WatchEvent<?> event : watchKey.pollEvents()) { 
       System.out.println("Received event '" 
        + event.kind() 
        + "' for entry '" 
        + event.context() 
        + "' in watched directory '" 
        + directory + "'" 
       ); 
      } 

      if (!watchKey.reset()) { 
       System.out.println("Failed to reset watch key: will not process more events"); 
       break; 
      } 
     } 

     //Lets clean up after ourselves 
     Files.walkFileTree(tempDirectory, new SimpleFileVisitor<Path>() { 
      @Override 
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
       Files.delete(file); 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { 
       Files.delete(dir); 
       return FileVisitResult.CONTINUE; 
      } 
     }); 
    } 
} 

出力:

は、どのように私は、これは簡単なサンプルアプリケーションopexFolderのキーまたはdocupostFolderのキー

ただ、ここでPath directory = WatchKey::watchable()

を呼び出していると言うことができます。

Created temporary directory: /tmp/watch-service-example4292865635932187600 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_0 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_1 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_2 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_3 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_4 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_5 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_6 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_7 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_8 
Created watched directory: /tmp/watch-service-example4292865635932187600/watched_9 
Initialization complete. When you create an entry in the watch dirs you'll be notified. 
Processing events for watched directory: /tmp/watch-service-example4292865635932187600/watched_5 
Received event 'ENTRY_CREATE' for entry 'test' in watched directory '/tmp/watch-service-example4292865635932187600/watched_5' 
Processing events for watched directory: /tmp/watch-service-example4292865635932187600/watched_8 
Received event 'ENTRY_CREATE' for entry 'test' in watched directory '/tmp/watch-service-example4292865635932187600/watched_8' 
+0

WatchKeyは通常一定ですか?これはopexFolderのキーかdocupostFolderのキーです。 –

+0

@ M.MELKI私の回答を更新しました –

+0

ありがとうございました! –

関連する問題