我有以下文件和文件夹结构:
/root/
/root/pictures/
/root/pictures/picture1.jpg
/root/pictures/picture2.jpg
我注册了两个WatchServices,一个用于/root/
文件夹,另一个用于/root/pictures
。对于我都注册的事件:ENTRY_CREATE
,ENTRY_DELETE
,ENTRY_MODIFY
。
当我删除/root/pictures/
时,我希望删除一个ENTRY_DELETE
事件,以删除/root/pictures/
和ENTRY_DELETE
和{picture1.jpg
两个picture2.jpg
个事件1}}。事实上,我只收到了ENTRY_DELETE
的{{1}}事件。当我只删除/root/pictures/
时,我会按预期收到一个删除事件。
这是正常行为吗?如何使用WatchService获取已删除文件夹内的文件列表?
答案 0 :(得分:1)
您没有显示任何代码,因此我们不知道您是如何尝试实现它的,但如果目录本身被删除,以下似乎可以为目录中的文件获取ENTRY_DELETE事件 (请注意,它只包含一个WatchService,目录xxx / yyy;我没有包含目录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
答案 1 :(得分:0)
看来您最终没有删除目录。 我的意思是,如果您在Windows中通过键“ delete”删除目录,则会收到一个删除文件夹/ root / pictures /的事件。但是您的文件仍然可以在垃圾桶中保存。如果您清除垃圾桶-您将获得picture1.jpg和picture2.jpg的ENTRY_DELETE事件
答案 2 :(得分:0)
摘自WatchService
上的文档(重点是我):
平台依赖项
观察文件系统事件的实现是 旨在直接映射到本机文件事件通知 ,或使用原始机制,例如 在没有本地工具时进行轮询。 因此,许多 有关如何检测事件,其及时性的详细信息,以及 是否保留其顺序是高度实现 具体。 [...]
这意味着事件传递的许多方式都取决于平台。对您的问题,这是正常行为吗?答案是:取决于平台。