IResourceChangeEvent - 如何识别项目删除/重命名

6
如何在通过ResourcePlugin.getWorkspace().addResourceChangeListener(...)添加的IResourceChangeListener中正确区分已删除/重命名的项目?
通过尝试,似乎IResourceChangeEvent.getDelta() -> IResourceDelta会是答案。
Eclipse API得知:
批量报告任意创建、删除和修改资源以及表达为分层资源增量的事后事件。事件类型为POST_CHANGE,getDelta返回分层增量。资源增量以工作区根为根。这些事件在一组资源更改之后向感兴趣的各方广播,并且无论是否启用自动构建都会发生。在通知这些事件期间,工作区对于更改是关闭的。此事件周期中报告的增量在注册了此类事件的所有侦听器中均相同。
编辑:迄今为止我的发现
因此,Event.getType()POST_CHANGE,需要满足以下条件之一:
  • 包含一个子 IResourceDelta,其 getKind() == REMOVED 表示删除,并且 delta 的 getResource().getType() == PROJECT 以便我们知道它是一个项目(此 IResourceDelta 不应该有任何子项)

  • 包含两个子项 IResourceDelta,其 getKind() == REMOVEDgetKind() == ADDED,并且 getResource().getType() == PROJECT,这些 IResourceDelta 不包含子 Delta(我观察到当文件被重命名/删除时,资源所属的 IProject 是父 Delta 的第一行子项...)

能否有人确认这个假设?是否真的需要对子项进行树深度搜索,才能确定事件是项目重命名/删除还是文件/文件夹?

1个回答

1
  • 您需要通过ResourcePlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE)添加资源更改监听器

  • 在您的监听器中,使用IResourceDeltaVisitor遍历所有变化的delta,方法是event.getDelta().accept(...)

  • 访问器应查看已删除的项目REMOVED

  • 如果您希望项目被删除并以相同的名称创建(与构建事件期间发生的文件和文件夹相同),则除了REMOVED之外,还应在delta中查找REPLACED


1
使用这种方法,我如何识别项目重命名? - Vlad Ilie
我和 Vlad 有同样的问题。如何仅识别重命名事件? - 2c00L
找到一个答案:http://stackoverflow.com/questions/30170492/how-to-use-an-iresourcechangelistener-to-detect-a-file-rename-and-set-the-editor?lq=1 - chani
这并没有回答问题的关键点,我认为关键点是“如何区分'删除'与'重命名'事件”。 - Kris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接