gpt4 book ai didi

Java WatchService 删除父目录时不报告文件

转载 作者:行者123 更新时间:2023-11-30 07:06:33 25 4
gpt4 key购买 nike

我有以下文件和文件夹结构:

/root/

/root/pictures/

/root/pictures/picture1.jpg

/root/pictures/picture2.jpg

我注册了两个 WatchService,一个用于 /root/ 文件夹,另一个用于 /root/pictures。对于这两个事件,我注册了事件:ENTRY_CREATEENTRY_DELETEENTRY_MODIFY

当我删除 /root/pictures/ 时,我希望收到一个用于删除文件夹 /root/pictures/ENTRY_DELETE 事件以及 picture1.jpgpicture2.jpg 的两个 ENTRY_DELETE 事件。事实上,我只收到 /root/pictures/ENTRY_DELETE 事件。当我只删除 picture1.jpg 时,我会按预期收到一个删除事件。

这是正常行为吗?如何使用 WatchService 获取已删除文件夹内的文件列表?

最佳答案

您没有显示任何代码,因此我们不知道您如何尝试实现它,但如果目录本身被删除,以下内容似乎可以获取目录中文件的 ENTRY_DELETE 事件(请注意,它只包含一个针对目录 xxx/yyy 的 WatchService;我没有包含针对目录 xxx 的另一个 WatchService)

public class WatchServiceApp {

public static void main(String[] args) throws IOException {
WatchService watchService = FileSystems.getDefault().newWatchService();
Path dirPath = Paths.get("/home/myuser/xxx/yyy");
WatchKey watchKey = dirPath.register(
watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

while (true) {
try {
watchService.take();
} catch (InterruptedException ex) {
break;
}

List<WatchEvent<?>> watchEventList = watchKey.pollEvents();
for (WatchEvent<?> watchEvent : watchEventList) {
Path filePath = (Path) watchEvent.context();
System.out.println("Event " + watchEvent.kind() + " for " + filePath.toString());
}

boolean watchKeyValid = watchKey.reset();
if (!watchKeyValid) {
break;
}
}
}

}

假设目录 xxx/yyy 包含三个文件。首先我们删除单个file3并得到

Event ENTRY_DELETE for file3

然后我们删除整个yyy目录并得到

Event ENTRY_DELETE for file2
Event ENTRY_DELETE for file1

关于Java WatchService 删除父目录时不报告文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024001/

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