关于Eclipse的workspace里资源改变

本文探讨了Eclipse工作区(workspace)中资源管理的问题,包括如何处理资源改变、null异常的解决、资源构建(build)过程以及SWT相关操作。同时,讲解了删除资源的注意事项,帮助开发者更好地理解和操作Eclipse的项目资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为workspace里的资源加一个listener是最容易想的了,不多说了,看代码:
   IWorkspace workspace = ResourcesPlugin.getWorkspace();
IResourceChangeListener listener = new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
System.out.println("Something changed!");
}
};
workspace.addResourceChangeListener(listener);

//... some time later one ...
workspace.removeResourceChangeListener(listener);

资源的修改由插件里API提供方法,最常见的就是创建、挎贝、移动、删除、内容的修改。这些改变资源的方法按如下的规律执行:

 

* This method changes resources; these changes will be reported

* in a subsequent resource change event.

复合资源操作

在这种机制下将触发将resource change event发布到所有的listener里;还有一种情况就是,如果一个操作包含在另一个操作内的话,这个操作将没有必要发出通知,而要等到最高层次的操作完成以后,对listener的通知才会发出。这就是复合操作的事件通知机制,见如下示例代码:

 IWorkspace workspace = ResourcesPlugin.getWorkspace();
final IProject project = workspace.getRoot().getProject("My Project");
IWorkspaceRunnable operation = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
int fileCount = 10;
project.create(null);
project.open(null);
for (int i = 0; i < fileCount; i++) {
IFile file = project.getFile("File" + i);
file.create(null, IResource.NONE, null);
}
}
};
workspace.run(operation, null);

资源内容的改变

在IResourceEvnet里最重要的两个鸟就是 event typeresource deltaevent type是一个int类型的,用来表明自己的类型;另外那个是IResourceDelta是实例,它是树型结构的,(就叫上它修改树吧),与资源里的树型结构相对应,记录每一个资源节点的改变,具体的内容如下:

  • The resource it corresponds to.
  • The kind of modification (added, removed, or changed).
  • The precise nature of the change (the change flags).
  • A summary of what markers changed on the resource.
  • Deltas for any added, removed, or changed children.

其中IResourceDelta.getFlags()可以得到每一个修改的标记。

(例子和标记内容见引用文章)http://www.eclipse.org/articles/Article-Resource-deltas/resource-deltas.html

当然还包括一些其它的事件,可以通过IWorkspace.addResourceChangeListener.IResourceChangeListener, int)加入到workspace里,int可以是POST_CHANGEPRE_DELETE等,包含修改树的事件有:POST_CHANGE, PRE_BUILD,POST_BUILD。

要点:

性能。listener里作的任何动作不要太占资源,比如:对服务器进行连接、访问I/O之类操作;关于这点的理解可以看看Observer模型。如果实在不行的话,你就把这些操作放到另一个后台线程里去;或者要不选一个其它方便时间来做。

当然IResourceDetla也同样提供了一些高效的方法来用,见下

IResourceDelta.accept(IResourceDeltaVisitor)

IResourceDelta.findMember(IPath)

IResourceChangeEvent.findMarkerDeltas

线程安全。最重要的是要明白资源可能会任何一个线程里被改动,所以在你的listener里加入线程的时候你必须做好线程同步工作。如果涉及到SWT的话那么要使用org.eclipse.swt.widgets.Display类里的syncExec和asyncExec方法。

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值