当前位置: 首页 > 知识库问答 >
问题:

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

艾修然
2023-03-14

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

/root/

/root/pictures/

/root/pictures/picture1.jpg

/root/pictures/picture2.jpg

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

当我删除/root/图片/时,我希望得到一个用于删除文件夹/root/图片/ENTRY_DELETE事件和两个ENTRY_DELETE事件用于picture1.jpgpicture2.jpg。事实上,我只得到/root/图片/ENTRY_DELETE事件。当我只删除picture1.jpg时,我得到一个预期的删除事件。

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

共有3个答案

赏梓
2023-03-14

WatchService上的留档(强调我的):

平台依赖性

观察来自文件系统的事件的实现旨在直接映射到本机文件事件通知设施(如果可用),或者在本机设施不可用时使用原始机制,例如轮询 因此,关于如何检测事件、事件的及时性以及事件的顺序是否得到保留的许多细节都与实现高度相关 […]

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

扈阳辉
2023-03-14

看起来你最终没有删除你的目录。我的意思是,如果你在Windows中按delete键删除目录,你会得到一个删除文件夹/root/pictures/的事件。但你的文件在垃圾桶里还活着。如果你要清理垃圾桶,你将获得图片1的条目和删除事件。jpg和图片2。jpg

李新霁
2023-03-14

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

Event ENTRY_DELETE for file3

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

Event ENTRY_DELETE for file2
Event ENTRY_DELETE for file1
 类似资料:
  • 删除父实体时,我还想删除关联的子实体(从数据库中)。我试图在删除时使用级联,如下所示,但我一定做错了什么。 当对父实体对象调用删除时,我收到错误消息:“该实体仍在数据库的其他地方引用”。我可以确认该实体在数据库的其他地方引用的唯一地方是在下面的两个表中(如果我手动从数据库中删除子行,对父实体对象的删除调用工作正常)。在过去的9个小时里,我一直在阅读实体对象并尝试不同的东西。我做错了什么? 这是我的

  • 我正在这里学习“带有链接实体生命周期的双向多对多”教程https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/hibernate_user_guide.html#associations-many-to-many。但是,我使用的是Spring JPA而不是实体管理器。当我使用repository接口删除一个地址时,这并不是不删除

  • 问题内容: 我想知道,删除包含所有文件的目录的最简单方法是什么? 我正在删除一个文件夹,但是,如果其中有文件,我将无法删除。 问题答案: 如今至少有两种选择。 在删除文件夹之前,请删除其所有文件和文件夹(这意味着递归!)。这是一个例子: } 如果您使用的是5.2+,则可以使用RecursiveIterator来实现,而无需自己实现递归:

  • 我有一个目录,它是在执行应用程序后创建的。在使用应用程序的过程中,它充满了一些图片,这些图片是ComboBox的ItemsSource。在关闭应用程序之前,我试图通过设置new()或NULL来清除ItemsSource并删除该目录。如果目录为空,则会正常删除。但除此之外——什么都没有发生,也没有例外。我做错了什么? 创建目录并将路径值分配给“FeedBackScreenshotsPath” 删除

  • 前面小节介绍了如何使用 touch 和 mkdir 创建文件和目录,本小节介绍如何删除文件和目录。 1. 删除文件 使用 rm 文件名 命令可以删除文件,以删除普通文件为例: ls -l # 列出当前目录下的所有文件 rm test.c # 使用 rm 命令删除 test.c 文件 ls -l # 再次查看当前目录下的所有文件 执行结果如下图: 可以看到 test.c 文件已经被删除了

  • 我的实体。ValidationStep与documentDetail有一对一的关系,documentDetail与documentValidations有一个完全的关系 我的删除查询 父ValidationStep被删除,但是docDetail和documentValidations仍然在数据库中。