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

删除父目录时,Java WatchService不报告文件,java,watchservice,Java,Watchservice,我有以下文件和文件夹结构: /root/ /root/pictures/ /root/pictures/picture1.jpg /root/pictures/picture2.jpg 我注册了两个WatchServices,一个用于/root/文件夹,另一个用于/root/pictures。对于这两个事件,我都注册了事件:ENTRY\u CREATE,ENTRY\u DELETE,ENTRY\u MODIFY 当我删除/root/pictures/时,我希望为文件夹/root/pict

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

/root/

/root/pictures/

/root/pictures/picture1.jpg

/root/pictures/picture2.jpg
我注册了两个WatchServices,一个用于
/root/
文件夹,另一个用于
/root/pictures
。对于这两个事件,我都注册了事件:
ENTRY\u CREATE
ENTRY\u DELETE
ENTRY\u MODIFY

当我删除
/root/pictures/
时,我希望为文件夹
/root/pictures/
删除获得一个
ENTRY\u delete
事件,为
picture1.jpg
picture2.jpg
获得两个
ENTRY\u delete
事件。事实上,我只得到
/root/pictures/
条目\u DELETE
事件。当我只删除
picture1.jpg
时,我得到了一个预期的删除事件


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

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

然后我们删除整个yyy目录并获取

Event ENTRY_DELETE for file2
Event ENTRY_DELETE for file1

看起来您最终没有删除您的目录。 我的意思是,如果您按delete键删除Windows中的目录,您将获得一个删除文件夹/root/pictures/的事件。但是你的文件在垃圾桶里还活着。如果您要清除垃圾桶-您将从(我的)文档中获得picture1.jpg和picture2.jpg的条目\u删除事件:

平台依赖关系

从文件系统观察事件的实现是 用于直接映射到本机文件事件通知 设施,或使用原始机制,如 当本机设施不可用时进行轮询。因此,许多 有关如何检测事件、事件的及时性以及 它们的顺序是否被保留在很大程度上取决于它们的实现 具体的[……]


这意味着许多事件的交付方式都依赖于平台。对于你的问题,这是正常的行为吗?答案是:取决于平台。

谢谢您的代码。这真的很有趣,因为它对我来说并不像预期的那样有效。当我删除关注的文件夹时,程序停止,不会给出任何输出。当我只是删除监视文件夹中的一个文件时,我会得到输出。我应该补充一点,我正在运行Mac OS 10.12的代码。这可能是一个只发生在Mac OS上的错误吗?您会收到目录中条目的事件,但不会收到目录本身的事件。在您的代码中,您还收到一个目录本身的事件,因为您为其父目录创建了另一个WatchService。这就是为什么我强调WatchService不存在于我的代码中。在这方面,操作系统很可能不会产生任何影响。是的,在我的原始代码中,我运行了多个WatchServices。但是当我为/xxx/yyy创建WatchService并将/xxx/yyy移动到bin时,我完全按照您描述的方式尝试了您的代码,但没有收到文件通知。这意味着您在删除/xxx/yyy时,确实在/xxx/yyy中存在一些文件(即它不是空的),与我在示例中对file1和file2所做的不同,这些文件没有任何删除事件?
Event ENTRY_DELETE for file3
Event ENTRY_DELETE for file2
Event ENTRY_DELETE for file1