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.
The method I supplied above was taken from this example (omitting some parts for brevity).
Read the tutorial for the details.
The reason you are only seeing an event for "E:/Raja/Test" and not "E:/Raja/Test/Foo.txt" (for example) is that you've only registered the "E:/Raja" directory with the service. This means you will see events on the directory and its immediate members. The "E:/Raja/Test" is a member of the directory, and you are getting events to say that is has been changed ... when files are added to it.
The solution is to register all of subdirectories of "E:/Raja" as well ... going as far down the directory hierarchy as you need to go.
I know this is ugly, hopefully somebody has a better answer but you can create a list of every file in every subfolder and there last modified times.
When you receive ENTRY_CREATE or ENTRY_DELETE compare the folder to your list to figure out which file was changed
When you receive a ENTRY_MODIFY compare the last modified times.
Remember to update your list.
来源:https://stackoverflow.com/questions/16611426/monitor-subfolders-with-a-java-watch-service