//訪問工作空間
IWorkspace workspace = ResourcesPlugin.getWorkspace();
//獲得工作空間中的資源層次結(jié)構(gòu)的頂部
IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
//訪問工作空間中的項目
IProject myProject = myWorkspaceRoot.getProject("MyProj");
if(myProject.exists() && !myProject.isOpen())
myProoject.open(null);
//根據(jù)位于工作空間外部的文件的內(nèi)容來創(chuàng)建文件資源
IFolder imagesFolder = myWebProject.getFolder("images");
if (imagesFolder.exists()) {
// create a new file
IFile newLogo = imagesFolder.getFile("newLogo.png");
FileInputStream fileStream = new FileInputStream("c:/MyOtherData/newLogo.png");
newLogo.create(fileStream, false, null);
// create closes the file stream, so no worries.
}
//從原始文件復制 newLogo 文件
IFolder newImagesFolder = myProject.getFolder("newimages");
newImagesFolder.create(false, true, null);
IPath renamedPath = newImagesFolder.getFullPath().append("renamedLogo.png");
newLogo.move(renamedPath, false, null);
IFile renamedLogo = newImagesFolder.getFile("renamedLogo.png");
資源路徑名不是完整的文件系統(tǒng)路徑,而是基于項目的位置(通常是工作空間目錄),要獲取資源的完整文件系統(tǒng)路徑,必須使用 IResource.getLocationURI 來查詢它的位置。
給定文件系統(tǒng)路徑,如果要獲取對應(yīng)的資源對象,則可以使用 IWorkspaceRoot.findFilesForLocationURI 或 IWorkspaceRoot.findContainersForLocationURI。
//控制文件系統(tǒng)刷新
IResource.refreshLocal(int depth, IProgressMonitor monitor)
//獲得表示項目級別首選項的節(jié)點
IScopeContext projectScope = new ProjectScope(MyProject);
Preferences projectNode = projectScope.node("com.example.myplugin");
if (projectNode != null) {
value = node.getBoolean("MyPreference", "true");
//do something with the value.
}
projectNode.flush();
//查詢文件的字符集(僅應(yīng)返回對該文件顯式定義的字符集)
String charset = myFile.getCharset(false);
//查詢文件的字符集(返回隱含的字符集)
String charset = myFile.getCharset(true);
//獲取文件內(nèi)容描述
IFile file = ...;
IContentDescription description = file.getDescription();
//確定給定位置對于創(chuàng)建鏈接的資源是有效的
IWorkspace.validateLinkLocation(IResource resource, IPath location)
禁用鏈接資源
· 項目性質(zhì)否決
<extension
id="myNature"
name="My Nature"
point="org.eclipse.core.resources.natures">
<runtime>
<run class="com.xyz.MyNature"/>
</runtime>
<options allowLinking="false"/>
</extension>
· 小組掛鉤
如果定義自己的資源庫實現(xiàn),則可以利用 org.eclipse.core.resources.teamHook 擴展點來防止在共享資源庫類型的項目中創(chuàng)建鏈接的資源。
//定義路徑變量
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IPathVariableManager pathMan = workspace.getPathVariableManager();
String name = "TEMP";
IPath value = new Path("c:\\temp");
if (pathMan.validateName(name).isOK() && pathMan.validateValue(value).isOK()) {
pathMan.setValue(name, value);
} else {
//invalid name or value, throw an exception or warn user
}
//創(chuàng)建相對于已定義的路徑變量的鏈接資源
IProject project = workspace.getProject("Project");//assume this exists
IFolder link = project.getFolder("Link");
IPath location = new Path("TEMP/folder");
if (workspace.validateLinkLocation(location).isOK()) {
link.createLink(location, IResource.NONE, null);
} else {
//invalid location, throw an exception or warn user
}
//至此
link.getFullPath() ==> "/Project/Link"
link.getLocation() ==> "c:\temp\folder"
link.getRawLocation() ==> "TEMP/folder"
link.isLinked() ==> "true"
IFile child = link.getFile("abc.txt");
child.create(...);
child.getFullPath() ==> "/Project/Link/abc.txt"
child.getLocation() ==> "c:\temp\folder\abc.txt"
child.getRawLocation() ==> "c:\temp\folder\abc.txt"
child.isLinked() ==> "false"
//創(chuàng)建標記
IMarker marker = file.createMarker(IMarker.TASK);
//創(chuàng)建具有全局作用域的標記
IMarker marker = IWorkspace.getRoot().createMarker(IMarker.TASK);
//刪除標記
try {
marker.delete();
} catch (CoreException e) {
// Something went wrong
}
//成批刪除標記
int depth = IResource.DEPTH_INFINITE;
try {
//如果把IMarker.PROBLEM改成null,則刪除所有標記
resource.deleteMarkers(IMarker.PROBLEM, true, depth);
} catch (CoreException e) {
// something went wrong
}
//使用平臺常量來處理屬性
IMarker marker = file.createMarker(IMarker.TASK);
if (marker.exists()) {
try {
marker.setAttribute(IMarker.MESSAGE, "A sample marker message");
marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
} catch (CoreException e) {
// You need to handle the case where the marker no longer exists }
}
//查詢資源以獲取其標記及其子代的標記
IMarker[] problems = null;
int depth = IResource.DEPTH_INFINITE;
try {
problems = resource.findMarkers(IMarker.PROBLEM, true, depth);
} catch (CoreException e) {
// something went wrong
}
使用 org.eclipse.core.resources.markers 擴展點來聲明自己的標記類型
<extension id="mymarker" point="org.eclipse.core.resources.markers" />
<extension id="myproblem" point="org.eclipse.core.resources.markers">
<super type="org.eclipse.core.resources.problemmarker"/>
<super type="com.example.markers.mymarker"/>
<attribute name="myAttribute" />
<persistent value="true" />
</extension>
//創(chuàng)建 com.example.markers.myproblem 標記類型的實例
public IMarker createMyMarker(IResource resource) {
try {
IMarker marker = resource.createMarker("com.example.markers.myproblem");
marker.setAttribute("myAttribute", "MYVALUE");
return marker;
} catch (CoreException e) {
// You need to handle the cases where attribute value is rejected
}
}
//查詢自己的標記類型(所有mymarkers和myproblems)
public IMarker[] findMyMarkers(IResource target) {
String type = "com.example.markers.mymarker";
IMarker[] markers = target.findMarkers(type, true, IResource.DEPTH_INFINITE);
}
//在工作空間可運行程序內(nèi)的工作單元中批處理插件對工作空間進行的修改
IWorkspaceRunnable myRunnable =
new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
//do the actual work in here
...
}
}
//運行工作空間可運行程序
IWorkspace workspace = ResourcesPlugin.getWorkspace();
workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
//從工作空間本身獲取資源規(guī)則工廠
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IResourceRuleFactory ruleFactory = workspace.getRuleFactory();
//可運行程序?qū)①Y源從一個位置移至另一個位置,可以包含適用于此操作的規(guī)則
ISchedulingRule movingRule = ruleFactory.moveResource(sourceResource, destinationResource);
workspace.run(myRunnable, movingRule, IWorkspace.AVOID_UPDATE, null);
//使用 MultiRule 來組合多條規(guī)則
ISchedulingRule movingRule = ruleFactory.moveResource(sourceResource, destinationResource);
ISchedulingRule modifyRule = ruleFactory.modifyResource(destinationResource);
workspace.run(myRunnable, MultiRule.combine(movingRule, modifyRule), IWorkspace.AVOID_UPDATE, null);
//不包括規(guī)則或更新標志的簡短格式
workspace.run(myRunnable, null);
//指定工作空間根作為調(diào)度規(guī)則將鎖定整個工作空間,直到可運行程序完成為止。
//這是執(zhí)行工作空間更新的最穩(wěn)當方法,但是它不太支持其他重視并行的插件。
workspace.run(myRunnable, workspace.getRoot(), IWorkspace.AVOID_UPDATE, null);
//跟蹤插件運行時發(fā)生的所有工作空間更改
IResourceChangeListener listener = new MyResourceChangeReporter();
ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE);
//注冊資源更改偵聽器
IResourceChangeListener listener = new MyResourceChangeReporter();
ResourcesPlugin.getWorkspace().addResourceChangeListener(listener,
IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE
| IResourceChangeEvent.PRE_AUTO_BUILD | IResourceChangeEvent.POST_AUTO_BUILD
| IResourceChangeEvent.POST_CHANGE);
//實現(xiàn)資源更改偵聽器
public class MyResourceChangeReporter implements IResourceChangeListener {
public void resourceChanged(IResourceChangeEvent event) {
IResource res = event.getResource();
switch (event.getType()) {
case IResourceChangeEvent.PRE_CLOSE:
System.out.print("Project ");
System.out.print(res.getFullPath());
System.out.println(" is about to close.");
break;
case IResourceChangeEvent.PRE_DELETE:
System.out.print("Project ");
System.out.print(res.getFullPath());
System.out.println(" is about to be deleted.");
break;
case IResourceChangeEvent.POST_CHANGE:
System.out.println("Resources have changed.");
event.getDelta().accept(new DeltaPrinter());
break;
case IResourceChangeEvent.PRE_AUTO_BUILD:
System.out.println("Auto build about to run.");
event.getDelta().accept(new DeltaPrinter());
break;
case IResourceChangeEvent.POST_AUTO_BUILD:
System.out.println("Auto build complete.");
event.getDelta().accept(new DeltaPrinter());
break;
}
}
}
//查詢資源變化的實現(xiàn)類
class DeltaPrinter implements IResourceDeltaVisitor {
public boolean visit(IResourceDelta delta) {
IResource res = delta.getResource();
switch (delta.getKind()) {
case IResourceDelta.ADDED:
System.out.print("Resource ");
System.out.print(res.getFullPath());
System.out.println(" was added.");
break;
case IResourceDelta.REMOVED:
System.out.print("Resource ");
System.out.print(res.getFullPath());
System.out.println(" was removed.");
break;
case IResourceDelta.CHANGED:
System.out.print("Resource ");
System.out.print(res.getFullPath());
System.out.println(" has changed.");
break;
}
return true; // visit the children
}
}
//從提供的資源變化中獲取進一步的信息
case IResourceDelta.CHANGED:
System.out.print("Resource ");
System.out.print(delta.getFullPath());
System.out.println(" has changed.");
int flags = delta.getFlags();
if ((flags & IResourceDelta.CONTENT) != 0) {
System.out.println("--> Content Change");
}
if ((flags & IResourceDelta.REPLACED) != 0) {
System.out.println("--> Content Replaced");
}
if ((flags & IResourceDelta.MARKERS) != 0) {
System.out.println("--> Marker Change");
IMarkerDelta[] markers = delta.getMarkerDeltas();
// if interested in markers, check these deltas
}
break;
//將工作移至 WorkspaceJob 子類型
class MyWorkspaceJob extends WorkspaceJob {
public MyWorkspaceJob() {
super("My Workspace Job");
}
public IStatus runInWorkspace(IProgressMonitor monitor) {
//do the actual work in here
doSomeWork();
return Status.OK_STATUS;
}
}
//對該作業(yè)附加調(diào)度規(guī)則以避免同時修改 myProject
MyWorkspaceJob job = new MyWorkspaceJob();
job.setRule(myProject);
job.schedule();