当一个文件被删除时,正在使用VFS(apache共享资源)监控,当文件被添加回来时,我不会收到通知



我有一个简单的文件监视器设置,可以监视一个文件,以便在该文件的内容更改、添加或删除时收到通知。但当文件被删除时,当它被添加回来时,我从未收到通知。以下是我的代码片段:

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

相关内容

  • 没有找到相关文章

最新更新