2014-11-16 1 views
1

В JAVA Я буду смотреть каталог с помощью WatchService.Использование WatchService в JAVA. Могу ли я смотреть подкаталог одновременно?

Например, если я смотрю/пользователи/монитор, WatchService может смотреть только одну директорию.

Но я хочу смотреть каждый подкаталог «в то же время»

watch /users/monitor 
/users/monitor/a 
/users/monitor/b 
... 

Как я могу закодировать? T_T

--------------------------- код ----------------- --------------

package testpack; 

import java.nio.file.*; 
import java.util.List; 
import java.io.*; 

class DirectoryFilter implements FileFilter { 
    public boolean accept(File file) { 
     return file.isDirectory(); 
    } 
} 

public class DirectoryWatchExample { 
    public static void testForDirectoryChange(Path myDir) { 
     while (true) { 
      try { 
       WatchService watcher = myDir.getFileSystem().newWatchService(); 
       myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, 
         StandardWatchEventKinds.ENTRY_DELETE, 
         StandardWatchEventKinds.ENTRY_MODIFY); 

       WatchKey watckKey = watcher.take(); 

       List<WatchEvent<?>> events = watckKey.pollEvents(); 
       for (WatchEvent event : events) { 
        if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { 
         System.out.println("Created: " 
           + event.context().toString()); 
        } 
        if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) { 
         System.out.println("Delete: " 
           + event.context().toString()); 
        } 
        if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { 
         System.out.println("Modify: " 
           + event.context().toString()); 
        } 
       } 

      } catch (Exception e) { 
       System.out.println("Error: " + e.toString()); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     Path myDir = Paths.get("https://stackoverflow.com/users/heejoongkim/monitor"); 
     // define a folder root 
     System.out.println("Monitor Start"); 
     File dir = new File("https://stackoverflow.com/users/heejoongkim/monitor"); 
     testForDirectoryChange(myDir); 
    } 
} 

--------------------------- код- ------------------------------

+3

Я не вижу, как это может иметь 2 upvotes и комментариев и ответов. Этот вид кажется дубликатом http://stackoverflow.com/questions/5608234/how-can-i-watch-subdirectory-for-changes-with-watchservice-java?rq=1 – mattias

ответ

0

Вы можете зарегистрировать несколько каталогов для одного и того же наблюдателя. В зависимости от того, как создается подкаталог. Если каталог уже существует, вы можете выполнить цикл с помощью File.listFiles и зарегистрировать каждую директорию для одного наблюдателя.

Если файл создан после регистрации наблюдателя, вы можете сделать следующее. enter code here

for (WatchEvent<?> event: key.pollEvents()) 
      { 
       WatchEvent.Kind<?> kind = event.kind(); 
       WatchEvent<Path> ev = (WatchEvent<Path>)event;      
       Path filename = ev.context(); 

       Path child = dir.resolve(filename); 
       if(child.toFile().isDirectory() && ev.kind() == ENTRY_CREATE) 
       { 
        child.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 
       } 
       System.out.println(child); 
      }