我正在使用java.nio
WatchService
来观察文件系统的更改(对于webapp syncing project)。
然而,当我清理被监视的目录时,我遇到一个问题,即文件正在使用中(实际上,我正在使用maven清理,并且maven抱怨它无法清理所有内容)。这意味着WatchService会以某种方式锁定观察到的资源。
如何在没有任何锁定/禁止删除的情况下观看目录?
答案 0 :(得分:1)
我长期使用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;
}
更多信息:Link to 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);
}
}
我希望它有所帮助!
答案 1 :(得分:0)
如果您希望在观看时能够删除该条目,则应将观察者添加到下一个目录中。然后它会锁定该目录,但是如果你这样做一个永远不会被删除的目录,这将不是问题。
有时这会引发一个问题:“如果我想知道树下的变化怎么办?”如果您在Windows上使用Sun JRE,则可以使用修饰符ExtendedWatchEventModifier.FILE_TREE
,它将监视文件树中的所有修改,而不仅仅是直接子项。我不知道在任何其他平台上是否支持此修饰符。