2013-05-17 13 views
11

Sto utilizzando watchKey per ascoltare una modifica di file in una cartella particolare.Monitorare le sottocartelle con un servizio di visualizzazione Java

Path _directotyToWatch = Paths.get("E:/Raja"); 
WatchService watcherSvc = FileSystems.getDefault().newWatchService(); 
WatchKey watchKey = _directotyToWatch.register(watcherSvc, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 

while (true) { 
    watchKey=watcherSvc.take(); 
    for (WatchEvent<?> event: watchKey.pollEvents()) { 
     WatchEvent<Path> watchEvent = castEvent(event); 
     System.out.println(event.kind().name().toString() + " " + _directotyToWatch.resolve(watchEvent.context())); 
     watchKey.reset(); 
    } 
} 


farlo funzionare bene per me. Se modifico un file nella cartella raja mi dà il nome del file con percorso. Ma quando inserisco alcuni file in sottocartelle come "E:/Raja/Test", mi dà solo il percorso in cui l'ho inserito, non il nome del file.

Come ottenere il nome del file?

+2

questo è un duplicato di http://stackoverflow.com/questions/5608234/how-can-i-watch-subdirectory-for-changes-with-watch-service-java –

risposta

0

So che questo è brutto, si spera che qualcuno ha una risposta migliore, ma è possibile:

Soluzione 1:

creare una lista di tutti i file in ogni sottocartella e ci ultime volte modificate.

Quando si riceve ENTRY_CREATE o ENTRY_DELETE confrontare la cartella per la vostra lista per capire quali file è stato modificato

Quando si riceve un'ENTRY_MODIFY confrontare ultimi tempi modificati.

Ricordarsi di aggiornare l'elenco.

Edit: Come sugestion C# gestisce la cosa file di watcher meglio

+2

Soluzione 2 è come dire al tuo 5 anno vecchio per imparare a skateboard perché non può andare in bicicletta. Difficilmente una soluzione in quanto entrambi richiedono apprendimento. –

+0

Nessuna soluzione 2 è come dire al tuo bambino di 5 anni come appoggiarsi a uno skateboard perché vuole una bicicletta con 4 ruote, che possa stare nella sua borsa, salire in piedi e riporre nel suo armadietto della scuola. Ho fatto i filewatcher in java e C#. C# è semplicemente migliore – Nick

+3

Forse C# lo fa meglio, ma l'OP forse ha bisogno di lavorare con Java, quindi usare C# non sarebbe una soluzione. Penso che sia un suggerimento piuttosto che una soluzione. –

7

Il motivo che state vedendo solo un evento per "E:/Raja/Test" e non "E:/Raja/Test/Foo. txt "(per esempio) è che hai registrato la directory" E:/Raja "con il servizio. Ciò significa che vedrai gli eventi nella directory e nei suoi membri immediati. "E:/Raja/Test" è un membro della directory, e stai ricevendo eventi per dire che è stato cambiato ... quando i file vengono aggiunti ad esso.

La soluzione è registrare anche tutte le sottodirectory di "E:/Raja" ... andando più in basso nella gerarchia di directory che è necessario andare.

+1

Se registra E:/Raha ed E:/Raha/Test, penso che otterrà due eventi attivati ​​se E: /Raja/Test/Foo.txt viene creato. – Nick

+2

Sì, lo farà. Ma non è questo il punto. Il punto è che l'evento dall'osservatore su E:/Raha/Test gli darà un evento CREATE il percorso completo del file creato, ma l'altro sarà un evento MODIFY che fornisce il nome percorso della directory che è stata modificata. (OK ... vado dalla memoria ...) –

13

La ragione per cui che non stai ricevendo il nome del file creato/modificato all'interno di una sottocartella è dato da Stephen C nel suo answer.

Ecco un semplice esempio di come registrare directory e sottodirectory a guardarli per gli eventi a cui sei interessato:

/** 
* Register the given directory, and all its sub-directories, with the WatchService. 
*/ 
private void registerAll(final Path start) throws IOException { 
    // register directory and sub-directories 
    Files.walkFileTree(start, new SimpleFileVisitor<Path>() { 

     @Override 
     public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) 
      throws IOException { 
       dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 
       return FileVisitResult.CONTINUE; 
     } 

    }); 

} 

Partenza Java Tutorial ufficiale : Watching a Directory for Changes. Lì puoi trovare spiegazioni ed esempi molto carini con il codice sorgente.

In particolare, questo esempio di come guardare una directory (o l'albero di directory ) per le modifiche ai file: WatchDir.

Il metodo che ho fornito sopra è stato preso da questo esempio (omettendo alcune parti per brevità).
Leggere il tutorial per i dettagli.