繁体   English   中英

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

[英]Java WatchService does not report files when the parent directory is deleted

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

/root/

/root/pictures/

/root/pictures/picture1.jpg

/root/pictures/picture2.jpg

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

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

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

您没有显示任何代码,所以我们不知道您是如何尝试实现它的,但是如果目录本身被删除,以下内容似乎可以为目录中的文件获取 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 包含三个文件。 首先我们删除单个文件3并得到

Event ENTRY_DELETE for file3

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

Event ENTRY_DELETE for file2
Event ENTRY_DELETE for file1

看起来您最终没有删除您的目录。 我的意思是,如果您通过“删除”键删除 Windows 中的目录,您将收到一个删除文件夹 /root/pictures/ 的事件。 但是您的文件将仍然存在于垃圾桶中。 如果您将清除垃圾桶 - 您将获得 picture1.jpg 和 picture2.jpg 的 ENTRY_DELETE 事件

来自WatchService的文档(重点是我的):

平台依赖

从文件系统观察事件的实现旨在直接映射到可用的本地文件事件通知工具,或者在本地工具不可用时使用原始机制,例如轮询。 因此,关于如何检测事件、它们的及时性以及它们的排序是否保留的许多细节都是高度特定于实现的。 [...]

这意味着事件传递的大部分方式都依赖于平台。 对于您的问题,这是正常行为吗? 答案是:取决于平台。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM