WatchService 排除文件夹
WatchService exclude Folders
我正在尝试查看文件夹的更改。此文件夹包含我不想观看的子文件夹。不幸的是,WatchService 通知我这些子文件夹的更改。我猜这是因为这些文件夹的最后更改日期更新了。
所以我试图排除他们:
WatchService service = FileSystems.getDefault().newWatchService();
workPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
try {
WatchKey watchKey = watchService.take();
for (WatchEvent<?> event : watchKey.pollEvents()) {
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path fileName = ev.context();
if (!Files.isDirectory(fileName)) {
logger.log(LogLevel.DEBUG, this.getClass().getSimpleName(),
"Change registered in " + fileName + " directory. Checking configurations.");
/* do stuff */
}
}
if (!watchKey.reset()) {
break;
}
} catch (InterruptedException e) {
return;
}
虽然这不起作用。上下文的结果路径是相对路径,Files.isDirectory()
无法确定它是目录还是文件。
有没有办法排除子文件夹?
您可以试试下面的代码片段。为了得到完整路径,需要调用resolve()函数
Map<WatchKey, Path> keys = new HashMap<>();
try {
Path path = Paths.get("<directory u want to watch>");
FileSystem fileSystem = path.getFileSystem();
WatchService service = fileSystem.newWatchService();
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
if (<directory you want to exclude>) {
return FileVisitResult.SKIP_SUBTREE;
}
WatchKey key = dir.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
keys.put(key, dir);
return FileVisitResult.CONTINUE;
}
});
WatchKey key = null;
while (true) {
key = service.take();
while (key != null) {
WatchEvent.Kind<?> kind;
for (WatchEvent<?> watchEvent : key.pollEvents()) {
kind = watchEvent.kind();
if (OVERFLOW == kind) {
continue;
}
Path filePath = ((WatchEvent<Path>) watchEvent).context();
Path absolutePath = keys.get(key).resolve(filePath);
if (kind == ENTRY_CREATE) {
if (Files.isDirectory(absolutePath, LinkOption.NOFOLLOW_LINKS)) {
WatchKey newDirKey = absolutePath.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
keys.put(newDirKey, absolutePath);
}
}
}
if (!key.reset()) {
break; // loop
}
}
}
} catch (Exception ex) {
}
我正在尝试查看文件夹的更改。此文件夹包含我不想观看的子文件夹。不幸的是,WatchService 通知我这些子文件夹的更改。我猜这是因为这些文件夹的最后更改日期更新了。
所以我试图排除他们:
WatchService service = FileSystems.getDefault().newWatchService();
workPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
try {
WatchKey watchKey = watchService.take();
for (WatchEvent<?> event : watchKey.pollEvents()) {
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path fileName = ev.context();
if (!Files.isDirectory(fileName)) {
logger.log(LogLevel.DEBUG, this.getClass().getSimpleName(),
"Change registered in " + fileName + " directory. Checking configurations.");
/* do stuff */
}
}
if (!watchKey.reset()) {
break;
}
} catch (InterruptedException e) {
return;
}
虽然这不起作用。上下文的结果路径是相对路径,Files.isDirectory()
无法确定它是目录还是文件。
有没有办法排除子文件夹?
您可以试试下面的代码片段。为了得到完整路径,需要调用resolve()函数
Map<WatchKey, Path> keys = new HashMap<>();
try {
Path path = Paths.get("<directory u want to watch>");
FileSystem fileSystem = path.getFileSystem();
WatchService service = fileSystem.newWatchService();
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
if (<directory you want to exclude>) {
return FileVisitResult.SKIP_SUBTREE;
}
WatchKey key = dir.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
keys.put(key, dir);
return FileVisitResult.CONTINUE;
}
});
WatchKey key = null;
while (true) {
key = service.take();
while (key != null) {
WatchEvent.Kind<?> kind;
for (WatchEvent<?> watchEvent : key.pollEvents()) {
kind = watchEvent.kind();
if (OVERFLOW == kind) {
continue;
}
Path filePath = ((WatchEvent<Path>) watchEvent).context();
Path absolutePath = keys.get(key).resolve(filePath);
if (kind == ENTRY_CREATE) {
if (Files.isDirectory(absolutePath, LinkOption.NOFOLLOW_LINKS)) {
WatchKey newDirKey = absolutePath.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
keys.put(newDirKey, absolutePath);
}
}
}
if (!key.reset()) {
break; // loop
}
}
}
} catch (Exception ex) {
}