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

如何在通过ResourcePlugin.getWorkspace().addResourceChangeListener(...)项目被删除/重命名的IResourceChangeListener中正确区分?

通过尝试,看起来IResourceChangeEvent.getDelta() -> IResourceDelta就是答案。

来自Eclipse API :

事后批处理报告对一个或多个资源的任意创建,删除和修改,表示为分层资源增量。 事件类型为POST_CHANGE,getDelta返回分层增量。 资源增量根植于工作空间根目录。 这些事件在一组资源更改后广播给感兴趣的各方,并且无论是否启用了自动构建,都会发生这些事件。 在通知这些事件期间,工作区将关闭以进行更改。 在此事件周期中报告的增量在为此类事件注册的所有侦听器中是相同的。

编辑:到目前为止添加我的发现

所以, Event.getType()POST_CHANGE ,需要有

  • 包含子项IResourceDelta的delta,它具有getKind() == REMOVEDgetKind() == REMOVED ,以及delta getResource().getType() == PROJECT以便我们知道它是一个项目(此IResourceDelta不应该有任何子项)

  • 一个getDelta()包含两个子IResourceDelta ,它们有getKind() == REMOVEDgetKind() == ADDED ,还有getResource().getType() == PROJECT ,而那些IResourceDelta包含子Delt(我观察过)当重命名/删除文件时,资源所属的IProject是父Delta的第一行子节点上的那个…)

有人可以证实这个假设吗? 是否真的有必要对子项进行树深度搜索,以实现事件是项目重命名/删除还是文件/文件夹?

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

  • 在您的监听器中,使用IResourceDeltaVisitor通过event.getDelta().accept(...)访问delta中的所有更改event.getDelta().accept(...)

  • 访问者应该查看已REMOVED的项目

  • 如果您希望删除项目并使用相同的名称创建项目(在构建事件期间发生在文件和文件夹中),那么除了REMOVED ,还要在delta中查找REPLACED