gpt4 book ai didi

java - 从 WatchEvent 中确定已删除文件的类型

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:52 25 4
gpt4 key购买 nike

我有一个 WatchService监视 ENTRY_CREATE 的目录树, ENTRY_DELETEENTRY-MODIFY事件。问题是 WatchEvent<?> 的上下文只给出一个 Path 对象。在删除事件中,我不确定路径是否引用了常规文件的目录。

WatchKey key = null;

try {
key = watcher.take();
} catch (InterruptedException e) {
e.printStackTrace();
}

for (WatchEvent<?> event : key.pollEvents()) {
if (event.kind() == StandardWatchEventKinds.OVERFLOW) {
continue;
}

Path parent = (Path) key.watchable();
Path p = parent.resolve((Path) event.context());

for (DirectoryModifiedListener listener : listeners) {
if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
// only do this if p referred to a file, not a directory
listener.onFileCreated(p);
}
}
}

我的问题是如何判断路径是否为p指的是已删除的文件或目录? API 公开的内容甚至可能实现这一点吗?

最佳答案

Files.isDirectory(path) 顾名思义是实时检查。

Path 对象(分别是 WindowsPath 的实现)本身没有状态(或缓存的历史记录)。它只不过是路径的占位符。

因此可悲的答案是:您无法确定路径在删除后是否引用了目录。

一个解决方案是记住 Path 对象的种类,只要它们存在。这意味着在开始观看之前收集一份 list :

Path parent = Paths.get("/my/hotfolder");

Set<String> subdirs = new HashSet<String>();

for (Path p : Files.newDirectoryStream(parent)) {
if (Files.isDirectory(p))
subdirs.add(p.getFileName().toString());
}

注册 ENTRY_CREATE 以使列表保持最新

WatchKey key = hotfolder.register(watcher, ENTRY_CREATE, ENTRY_DELETE);

现在您可以确定子对象是否是目录:

for (WatchEvent<?> event : key.pollEvents())
{
if (event.kind() == StandardWatchEventKinds.OVERFLOW)
continue;

Path p = ((Path) key.watchable()).resolve((Path) event.context());

String filename = p.getFileName().toString();

if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE && Files.isDirectory(p))
subdirs.add(filename);

if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE)
{
if (subdirs.contains(filename))
{
for (DirectoryModifiedListener listener : listeners)
listener.onFileDeleted(p);

subdirs.remove(filename);
}
}
}

关于java - 从 WatchEvent 中确定已删除文件的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924754/

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