当使用VFS(apache commons)监视文件被删除时,我不会在文件被添加回来时收到通知

时间:2013-11-18 20:28:24

标签: java vfs apache-commons-vfs

我有一个简单的文件监视器设置,可以监视一个文件,以便在该文件的内容发生更改,添加或删除时收到通知。但是当文件被删除时,我再也没有得到通知。以下是我的代码片段:

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方法。这是正常的吗?如果是这样,我如何设置它以在删除后收到添加通知?

3 个答案:

答案 0 :(得分:1)

看起来你受this issue影响了。如票证中所述,您可以尝试设置零延迟:

fm.setDelay(0); 

或尝试修补的DefaultFileMonitor。但是,如果您要同时观看太多文件,那么小的延迟可能会对性能产生影响。

答案 1 :(得分:0)

感谢Jk1指出我的问题。答案是here

总之,当文件被删除时,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代码清除现有侦听器。

答案 2 :(得分:0)

我最近遇到了同样的问题。

我做的是解决它:

@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的父目录。该目录已被删除。