IResourceChangeEvent – 如何识别项目删除/重命名
如何在通过ResourcePlugin.getWorkspace().addResourceChangeListener(...)
项目被删除/重命名的IResourceChangeListener
中正确区分?
通过尝试,看起来IResourceChangeEvent.getDelta() -> IResourceDelta
就是答案。
来自Eclipse API :
事后批处理报告对一个或多个资源的任意创建,删除和修改,表示为分层资源增量。 事件类型为POST_CHANGE,getDelta返回分层增量。 资源增量根植于工作空间根目录。 这些事件在一组资源更改后广播给感兴趣的各方,并且无论是否启用了自动构建,都会发生这些事件。 在通知这些事件期间,工作区将关闭以进行更改。 在此事件周期中报告的增量在为此类事件注册的所有侦听器中是相同的。
编辑:到目前为止添加我的发现
所以, Event.getType()
是POST_CHANGE
,需要有
-
包含子项
IResourceDelta
的delta,它具有getKind() == REMOVED
的getKind() == REMOVED
,以及deltagetResource().getType() == PROJECT
以便我们知道它是一个项目(此IResourceDelta
不应该有任何子项) -
一个
getDelta()
包含两个子IResourceDelta
,它们有getKind() == REMOVED
和getKind() == 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