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

Vla*_*lie 6 java eclipse eclipse-plugin eclipse-rcp

如何IResourceChangeListener通过ResourcePlugin.getWorkspace().addResourceChangeListener(...)删除/重命名项目添加内容来正确区分?

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

来自Eclipse API:

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

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

所以,Event.getType()现在POST_CHANGE和那里都需要

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

  • 一个getDelta()包含两个孩子IResourceDeltagetKind() == REMOVEDgetKind() == ADDED,也getResource().getType() == PROJECT和那些IResourceDelta不包含儿童三角洲(我观察到,当一个文件被重命名/删除,IProject资源所属的是一个是孩子的第一行父母Delta...)

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

Pra*_* R. 1

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

  • 在您的侦听器中,使用 aIResourceDeltaVisitor来访问增量中的所有更改 event.getDelta().accept(...)

  • 访客应该查看以下项目REMOVED

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