繁体   English   中英

WatchService锁定一些文件?

[英]WatchService locks some files?

我正在使用java.nio WatchService来监视文件系统的更改(对于webapp同步项目 )。

但是,当我清理被监视的目录时,我遇到了一个文件正在使用的问题(事实上,我正在使用maven清理,而且maven抱怨它无法清理所有内容)。 这意味着WatchService会以某种方式锁定观察到的资源。

如何在没有任何锁定/禁止删除的情况下观看目录?

我长期使用Apache Commons VFS2在任何操作系统中都没有任何问题。 基本上,您需要一个类来实现FileListener接口,该接口允许您在从目录添加/更新/删除文件时执行操作:

public interface FileListener {
    /**
     * Called when a file is created.
     */
    void fileCreated(FileChangeEvent event) throws Exception;

    /**
     * Called when a file is deleted.
     */
    void fileDeleted(FileChangeEvent event) throws Exception;

    /**
     * Called when a file is changed.
     */
    void fileChanged(FileChangeEvent event) throws Exception;
}

更多信息: 链接到FileListener

然后,您需要为该文件侦听器启动监视器。 这里有一个未经测试的代码片段:

private void startMonitor() {
    Logger logger = LogManager.getLogger(MyClass.class);
    try {
        FileSystemManager fileSystemManager = VFS.getManager();
        FileObject dirToWatchFO = null;
        String path = "dir/you/want/to/watch";

        File pathFile = new File(path);
        path = pathFile.getAbsolutePath();
        dirToWatchFO = fileSystemManager.resolveFile(path);

        DefaultFileMonitor fileMonitor = new DefaultFileMonitor(new MyFancyFileListener());
        fileMonitor.setRecursive(false);
        fileMonitor.addFile(dirToWatchFO);
        fileMonitor.start();
    } catch (FileSystemException e) {
        logger.error("SOMETHING WENT WRONG!!", e);
    }
}

我希望它有所帮助!

如果您希望在仍在观看时删除该条目,则应将观察者添加到下一个目录中。 然后它将锁定该目录,但如果你这样做到一个永远不会被删除的目录,这将不是一个问题。

有时,这会引发一个问题:“如果我想了解树下的变化怎么办?” 如果您在Windows上使用Sun JRE,则可以使用修改器ExtendedWatchEventModifier.FILE_TREE ,它将监视文件树中的所有修改,而不仅仅是直接子项。 我不知道是否在任何其他平台上都支持此修饰符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM