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

时间:2016-10-13 14:35:30

标签: java watchservice

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

/root/

/root/pictures/

/root/pictures/picture1.jpg

/root/pictures/picture2.jpg

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

当我删除/root/pictures/时,我希望删除一个ENTRY_DELETE事件,以删除/root/pictures/ENTRY_DELETE和{picture1.jpg两个picture2.jpg个事件1}}。事实上,我只收到了ENTRY_DELETE的{​​{1}}事件。当我只删除/root/pictures/时,我会按预期收到一个删除事件。

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

3 个答案:

答案 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上的文档(重点是我):

  

平台依赖项

     

观察文件系统事件的实现是   旨在直接映射到本机文件事件通知   ,或使用原始机制,例如   在没有本地工具时进行轮询。 因此,许多   有关如何检测事件,其及时性的详细信息,以及   是否保留其顺序是高度实现   具体。 [...]

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