o pacote java.nio.file (jdk 7) possui várias classes que permitem monitorar eventos do sistema de arquivos (delete, modify, create)
fiz um teste e vi que funciona legal localmente, mas quando tento monitorar uma pasta em uma máquina remota na intranet (ambas Windows 7) os eventos não disparam.
Alguem sabe se é possivel usar essa funcionalidade em pastas remotas ??
minha classe de teste
(ref: http://docs.oracle.com/javase/tutorial/essential/io/notification.html)
public class Test01 {
public static void main(String[] args) throws IOException {
m2();
}
static void m2() throws IOException{
Path pastaMonitorada = Paths.get("\\\\192.168.1.2/rafael/pasta"); // teste local ok ("C:\\pasta");
WatchService monitor = FileSystems.getDefault().newWatchService();
Map<WatchKey, Path> registroPastasMonitoradas = new HashMap<>();
//eventos q serão monitorados
WatchKey setMonitorEventos = pastaMonitorada.register(monitor, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
//link watched folder with events to be listened
registroPastasMonitoradas.put(setMonitorEventos, pastaMonitorada);
while(true){
WatchKey watchKey = null;
try {
watchKey = monitor.take();
} catch (InterruptedException e) {
System.out.println("interrupeted ex: "+e.getMessage());
}
//pasta monitorada
Path pasta = registroPastasMonitoradas.get(watchKey);
System.out.println("pasta: "+pasta.toString());
if(pasta == null){
System.err.println("WatchKey not recognized!!");
continue;
}
for(WatchEvent<?> event : watchKey.pollEvents()){
WatchEvent.Kind kind = event.kind();
if (kind == OVERFLOW) {
continue;
}
WatchEvent<Path> ev = cast(event);
Path name = ev.context();
Path child = pastaMonitorada.resolve(name);
//imprime o evento
System.out.format("%s: %s\n", event.kind().name(), child);
boolean valid = setMonitorEventos.reset();
if(!valid){
registroPastasMonitoradas.remove(watchKey);
if(registroPastasMonitoradas.isEmpty())
break;
}
}
}
}
static <T> WatchEvent<T> cast(WatchEvent<?> event) {
return (WatchEvent<T>)event;
}
}