问题描述
我想看一个完整的文件系统进行更改。我正在谈论以递归方式查看目录中的更改。因此,在观看目录(或整个文件系统)时,也需要捕获子目录中的所有更改。应用程序需要能够通过收到通知来跟踪所有更改。
Java的WatchService不适合
Java已经has一个WatchService
功能,允许您监视目录以进行更改。但问题是,据我所知,这不是递归过程,因此您无法使用它来监视文件系统根目录中的所有更改。
明确地查看所有子目录
我想到的解决方案是显式注册指定根目录中的每个目录。然而,问题在于,在具有超过一百万个子目录的系统上,遍历并注册这些目录是非常昂贵的。这是因为系统需要以递归方式遍历整个文件系统,才能首先注册所有目录。如果没有崩溃应用程序甚至可能,此功能对性能的影响太大了。
逻辑解决方案
我假设一个操作系统会在文件系统上发生任何变化时触发/调用某种事件,应用程序能够监听。然而,我没有找到这样的东西。这将允许应用程序监听所有更改,而无需显式注册所有子目录。因此,这种方法对性能的影响很小。
问题
正在观看整个文件系统,或者在Java中以递归方式观看目录,以及如何实现这一目标?
答案 0 :(得分:2)
这个问题应该分成几个:
第一个问题的答案是方法不同。在Windows上,存在可以执行此操作的Windows API函数(.NET Framework中着名的FileSystemWatcher类是此API函数集的一种包装)。 Windows上更强大的方法是创建或使用预先创建的文件系统过滤器驱动程序。在Linux上存在inotify。在MacOS X上有几种方法(在这个主题的某处有一个问题),它们都不是通用的或总是可用的。 此外,除了文件系统过滤器驱动程序之外的所有方法都只适用于事件发生后的通知,但它们不允许您拦截和拒绝请求(AFAIK,我可能会在这里弄错)。
至于第二个问题,似乎没有通用的解决方案可以涵盖我上面提到的所有或大多数变体。您需要首先为每个操作系统选择机制,然后找到一些Java包装器来使用这些机制。
答案 1 :(得分:1)
请查看示例template_folder
即使你可以过滤你不想看的目录
答案 2 :(得分:0)
Here是一个观察目录(或树)以更改文件
的示例