我有一个简单的文件监视器设置,可以监视一个文件,以便在该文件的内容更改、添加或删除时收到通知。但当文件被删除时,当它被添加回来时,我从未收到通知。以下是我的代码片段:
String properyPath = "/some/directory/somexml.xml";
FileSystemManager fsManager;
fsManager = VFS.getManager();
FileObject listendir = fsManager.resolveFile( propertyPath );
DefaultFileMonitor fm = new DefaultFileMonitor( this );
fm.setRecursive( true );
fm.addFile( listendir );
fm.start();
当propertyPath文件被删除时,我会在fileDeleted实现中得到通知,但当我再次创建该文件时,fileAdded方法永远不会被调用。这正常吗?如果是,我如何设置它以在删除后收到添加通知?
您似乎受到了此问题的影响。如机票中所述,您可以尝试设置零延迟:
fm.setDelay(0);
或者尝试修补的DefaultFileMonitor。但是,如果您要同时监视过多的文件,那么小的延迟可能会对性能产生影响。
感谢Jk1为我指出这个问题。答案就在这里。
总之,vfs中的FileMonitorAgent类在删除文件时会删除侦听器。(参见检查方法)下面是重要的块:
// If the file existed and now doesn't
if (this.exists && !this.file.exists())
{
this.exists = this.file.exists();
this.timestamp = -1;
// Fire delete event
((AbstractFileSystem)
this.file.getFileSystem()).fireFileDeleted(this.file);
// Remove listener in case file is re-created. Don't want to fire twice.
if (this.fm.getFileListener() != null)
{
this.file.getFileSystem().removeListener(this.file,
this.fm.getFileListener());
}
// Remove from map
this.fm.queueRemoveFile(this.file);
}
该链接提供了一个已提交给vfs的解决方案。我认为目前唯一的解决方案是生成一个线程,在几秒钟后将文件重新添加到vfs中。你必须睡几秒钟,因为你会收到通知(通过fireFileDeleted),然后vfs代码会清除侦听器,所以你可以重新添加侦听器,直到你收到通知,vfs代码清除现有侦听器。
我最近也遇到过同样的问题。
我所做的是:
@Override
public void fileDeleted(FileChangeEvent arg0) throws Exception {
if (arg0.getFile().getName().getBaseName().equals("ErrLog.txt")) {
File removedFile = new File(arg0.getFile().getName().getPath());
removedFile.getParentFile().mkdirs();
}
}
在我的情况下,我正在监视ErrLog.txt的父目录。该目录已被删除。