I am using watchKey
to listen for a file change in a particular folder.
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();
}
}
It working fine for me. If I modify a file in raja folder it gives me the file name with path. But, when I put some files in subfolders like "E:/Raja/Test", it gives me only the path where I put it, not the file name.
How to get the file name?
The reason why you're not getting the file name created/modified inside a subfolder is given by Stephen C in his answer.
Here is a simple example of how to register directories and subdirectories to watch them for the events you are interested in:
/**
* 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;
}
});
}
Check out the official Java Tutorials: Watching a Directory for Changes. There you can find very nice explanations and examples with the source code.
Particularly you'll be interested in this example of how to watch a directory (or directory tree) for changes to files: WatchDir.java.
The method I supplied above was taken from this example (omitting some parts for brevity).
Read the tutorial for the details.