问题描述
我想查看完整的文件系统的更改。我说的是递归地观察目录中的更改。因此,当监视一个目录(或整个文件系统)时,也需要捕获子目录中的所有更改。应用程序需要能够通过收到通知来跟踪所有更改。
Java的WatchService不适合
Java已经has WatchService
功能,允许您监视目录的更改。但问题是,据我所知,这不是一个递归过程,因此您不能使用它来监视文件系统根目录中的所有更改。
明确查看所有子目录
我想到的一个解决方案是显式注册指定根目录中的每个目录。然而,这样做的问题是,在具有超过一百万个子目录的系统上遍历并注册这些目录非常耗费资源。这是因为系统需要递归地遍历整个文件系统以仅首先注册所有目录。如果该功能甚至可以在不导致应用程序崩溃的情况下实现,那么它对性能的影响将会太大。
逻辑解
我假设当文件系统上发生任何更改时,操作系统会触发/调用某种事件,应用程序能够监听该事件。然而,我还没有找到这样的东西。这将允许应用程序监听所有更改,而无需显式注册所有子目录。因此,这种方法对性能的影响是最小的。
问题
在 Java 中是否可以递归地监视整个文件系统或目录,以及如何实现这一点?
最佳答案
问题应该分为几个:
- 如何在特定操作系统上跟踪磁盘上的文件事件
- 如何在Java中使用这种机制
第一个问题的答案是方法不同。在 Windows 上,存在允许您执行此操作的 Windows API 函数(.NET Framework 中著名的 FileSystemWatcher 类是此 API 函数集的一种包装器)。 Windows 上更可靠的方法是创建或使用预先创建的文件系统过滤驱动程序。在 Linux 上存在 inotify 。在 MacOS X 上存在多种方法(周围有一个关于这个主题的问题),但没有一种方法是通用的或始终可用的。 此外,除了文件系统过滤器驱动程序之外的所有方法都只适合在事件发生后收到通知,但它们不允许您拦截和拒绝请求(AFAIK,我在这里可能会弄错)。
对于第二个问题,似乎没有一个通用的解决方案可以涵盖我上面提到的所有或大多数变体。您需要首先为每个操作系统选择机制,然后找到一些 Java 包装器来使用这些机制。
关于java - Java中如何观察完整文件系统的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34996253/