获取使用 WatchService 创建的文件的位置
Get location of file created using WatchService
我正在使用 WatchService 监视文件夹及其子文件夹中是否有新创建的文件。但是,当创建文件时,WatchService 会给出创建文件的名称,而不是其位置。有没有办法获取所创建文件的 absolute/relative 路径。
解决这个问题的一个粗略的方法是在所有子文件夹中搜索文件名,找到创建日期最新的那个。有更好的方法吗?
如果您在 dir
目录上注册一个 WatchService
,何时获取完整路径很简单:
// If the filename is "test" and the directory is "foo",
// the resolved name is "test/foo".
Path path = dir.resolve(filename);
有效,因为WatchService
只监控一个目录。如果你想监控子文件夹,你必须注册新的 WatchServices
.
回答您未格式化的评论(这将解决您的问题)
public static void registerRecursive(Path root,WatchService watchService) throws IOException {
WatchServiceWrapper wsWrapper = new WatchServiceWrapper();
// register all subfolders
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
wsWrapper.register(watchService, dir);
return FileVisitResult.CONTINUE;
}
});
wsWrapper.processEvents();
}
public class WatchServiceWrapper {
private final Map<WatchKey,Path> keys;
public WatchServiceWrapper () {
keys = new HashMap<>();
}
public void register(WatchService watcher, Path dir) throws IOException {
WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
keys.put(key, dir);
}
public void processEvents() {
for (;;) {
// wait for key to be signalled
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}
Path dir = keys.get(key);
if (dir == null) {
System.err.println("WatchKey not recognized!!");
continue;
}
//get fileName from WatchEvent ev (code emitted)
Path fileName = ev.context();
Path fullFilePath = dir.resolve(fileName);
//do some other stuff
}
}
}
我正在使用 WatchService 监视文件夹及其子文件夹中是否有新创建的文件。但是,当创建文件时,WatchService 会给出创建文件的名称,而不是其位置。有没有办法获取所创建文件的 absolute/relative 路径。
解决这个问题的一个粗略的方法是在所有子文件夹中搜索文件名,找到创建日期最新的那个。有更好的方法吗?
如果您在 dir
目录上注册一个 WatchService
,何时获取完整路径很简单:
// If the filename is "test" and the directory is "foo",
// the resolved name is "test/foo".
Path path = dir.resolve(filename);
有效,因为WatchService
只监控一个目录。如果你想监控子文件夹,你必须注册新的 WatchServices
.
回答您未格式化的评论(这将解决您的问题)
public static void registerRecursive(Path root,WatchService watchService) throws IOException {
WatchServiceWrapper wsWrapper = new WatchServiceWrapper();
// register all subfolders
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
wsWrapper.register(watchService, dir);
return FileVisitResult.CONTINUE;
}
});
wsWrapper.processEvents();
}
public class WatchServiceWrapper {
private final Map<WatchKey,Path> keys;
public WatchServiceWrapper () {
keys = new HashMap<>();
}
public void register(WatchService watcher, Path dir) throws IOException {
WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
keys.put(key, dir);
}
public void processEvents() {
for (;;) {
// wait for key to be signalled
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}
Path dir = keys.get(key);
if (dir == null) {
System.err.println("WatchKey not recognized!!");
continue;
}
//get fileName from WatchEvent ev (code emitted)
Path fileName = ev.context();
Path fullFilePath = dir.resolve(fileName);
//do some other stuff
}
}
}