gpt4 book ai didi

java - 获取使用 WatchService 创建的文件的位置

转载 作者:行者123 更新时间:2023-12-02 11:47:45 25 4
gpt4 key购买 nike

我正在使用 WatchService 来监视文件夹及其子文件夹中创建的新文件。但是,当创建文件时,WatchService 会给出所创建文件的名称,而不是其位置。有没有办法获取所创建文件的绝对/相对路径。

解决此问题的一种粗略方法是在所有子文件夹中搜索文件名并找到具有最新创建日期的文件名。有更好的方法吗?

最佳答案

如果您在 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
}
}
}

关于java - 获取使用 WatchService 创建的文件的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48083419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com