在Java中查看文件和目录更改

Phi*_*uez 2 java filesystems nio filesystemwatcher file

我在这里写的主要是关于从哪里开始的建议.我已经实现了一个类,它将使用Java的WatchService递归地查看目录.它可以很好地检测更改,但我注意到一个致命的缺陷:我无法删除正在监视包含正在监视的目录的目录.这似乎是WatchService的限制.

我也看了一下Apache的VFS FileListener,但是在我花费大约6个小时的时间构建一些包装器之前,我想我可能只会问那些比我自己更有知识的人.

我需要看到的目录是完全可操作的,除了被监视的根目录不会被删除或重命名.是否已经有一个好的类我可以用来监视不锁定文件或文件夹的文件和目录?我试图避免使用轮询/哈希比较方法,但我感觉越来越多,好像我需要使用这种方法并烧掉大量的CPU资源.我从哪里开始呢?理想情况下,我需要:

- 检测文件和目录的创建 - 检测文件和目录的删除 - 检测文件和目录的重命名 - 检测文件的修改 - 检测目录之间文件的移动

我也看到一些人认为观察者不可靠,并且他们使用两者的组合(偶尔在观察者失败的某个地方进行轮询),但男人听起来像是一种真正的痛苦,如果不是,我宁愿避免无论如何最好的方式.我有一种感觉,我需要轮询和散列,特别是因为我想检测文件的移动和重命名,但请告诉我们是否存在更好的选项.

在此先感谢,对不起代码特定的问题感到抱歉!

Jim*_*son 5

这将允许您尝试在D:\ Temp下创建,删除,移动和重命名文件,并且应该允许您了解所需内容:

import static com.sun.nio.file.ExtendedWatchEventModifier.FILE_TREE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class Foo3
{
    public static void main(String[] args) throws Exception
    {
        FileSystem fs = FileSystems.getDefault();
        WatchService ws = fs.newWatchService();
        Path pTemp = Paths.get("D:/Temp");
        pTemp.register(ws, new WatchEvent.Kind[] {ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE}, FILE_TREE);
        while(true)
        {
            WatchKey k = ws.take();
            for (WatchEvent<?> e : k.pollEvents())
            {
                Object c = e.context();
                System.out.printf("%s %d %s\n", e.kind(), e.count(), c);
            }
            k.reset();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)