Java WatchService 在监视映射的驱动器时不生成事件

2022-09-01 08:58:13

我实现了一个文件观察器,但我注意到java nio文件观察器不会为在映射驱动器上复制的文件生成事件。例如,我在Unix上运行文件观察程序来监视在Windows上映射的本地目录(),然后我在此目录中放置了一个文件(),但文件观察程序没有生成任何事件。现在,如果我在Windows上运行文件观察程序来观察映射的驱动器(),它指的是unix路径(),并且从unix中我将一个文件放在这个文件夹中,文件观察程序识别更改并生成一个事件。它看起来像一个错误,或者可能是我错过了一些东西,有什么想法吗?/sharedfolderH:\H:\H:\/sharedfolder


答案 1

我在尝试通过 CIFS 观看已装载的窗口共享时遇到了同样的问题。似乎不可能获取 CIFS 挂载的文件系统事件

Java 7 NIO FileWatcher的linux实现使用inotify。Inotify是一个Linux内核子系统,可以注意到文件系统的变化,它非常适合本地目录,但显然不适用于CIFS挂载

在Oracle,修复此错误似乎不是高优先级。(这是他们的责任吗?更多的操作系统问题...)

JNotify在Linux系统上也使用inotify,所以这也不是选项。

因此,不幸的是,映射驱动器监视似乎仅限于轮询器:

  • Apache VFS DefaultFileMonitor 以轮询目录(挂载共享)
  • 基于标准 Java API 的文件轮询器。
  • 使用 jCIFS 的自定义文件轮询器(因此不需要在主机上挂载共享)

我可能会尝试Apache VFS Monitor,因为它可以检测开箱即用的文件创建,更新和删除。它需要挂载共享,但这让操作系统负责 CIFS 连接,而不是我的应用程序。


答案 2

JDK 中的文件监视功能依赖于平台,因为它使用本机库,因此在不同的平台上可以采取不同的行为。我很惊讶它完全适用于网络驱动器 - Windows必须轮询网络映射驱动器进行更改,而Linux则不然(我应该说这是正确的)。

通常这种监控在操作系统内核中实现,它显然知道哪些文件在本地被修改/创建/等,但是操作系统没有简单的方法来知道网络驱动器上发生了什么,因为它没有独占控制权。