Eclipse RCP 資源管理(自定義Project)一 (轉)
基本概念
Eclipse開發平臺提供資源插件(org.eclipse.core.resources),插件提供對項目(Project)、文件(File)、文件夾(Folder)的相關管理和操作。
工作區(workspace)是用戶數據文件在平臺中的組織和保存區,工作區中的文件通過資源的概念進行組織。工作臺(Workbench)可以理解為用戶瀏覽和操作工作區的一個工具。資源插件提供創建、導航、操作工作區中資源的API。工作臺利用這些API提供對應功能給用戶,這些API也允許用戶進行擴展。
資源有三種類型:項目(Project)、文件(File)、文件夾(Folder)。項目中包含若幹個文件和文件夾,作為一個表示特殊區域的資源單元和容器,項目之間不可嵌套。工作區中有若幹個項目。文件和文件夾的概念和OS中的概念類似。
工作區中的資源以資源樹的形式進行組織,文件和文件夾都是項目的後代結點。定義了一個工作區根作為一類特殊的資源存在,作為資源樹的根節點。
資源的訪問
在開發平臺中,工作區由IWorkspace的實例進行表示,IWorkspace提供對工作區中的資源訪問接口。具體的,通過如下語句獲取工作區實例:
IWorkspace workspace = ResourcesPlugin.getWorkspace();
在文件系統中,工作區與一般的文件夾結構一致。但包含有兩類隱藏文件(夾),.metadata存放於工作區根位置,是一個文件夾,文件夾中保存包含有工作區結構的信息文件,在開發平臺中必須通過特殊的插件API進行訪問;.project則存在於項目節點位置,是一文件,文件中保存著與IProjectDescription.一致的信息。
資源插件提供IProject,IFolder, and IFile實現用戶對這些資源類型的訪問,IResource中則定義了擴展的通用操作接口,還可以使用org.eclipse.core.runtime中的接口IPath來表示工作區的資源或文件系統的訪問路徑。
對資源的訪問與對Java.io.File的訪問類似,當調用對應API時,返回一個句柄,不需要在訪問前確保資源是否存在。具體的,通過如下代碼實現訪問:
//獲取工作區根 IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); //從工作區根獲得項目實例IProject myWebProject = myWorkspaceRoot.getProject("MyWeb"); // open if necessary if (myWebProject.exists() && !myWebProject.isOpen()) myWebProject.open(null);
在對項目進行操作前,必須執行打開操作。打開項目操作將從文件系統中讀取項目結構並讀入內存,創建對應的項目資源樹,這是一個顯式的操作。
獲取項目實例的再下一層,就是對項目中的文件和文件夾進行訪問:
//獲取文件夾實例 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. }
上面的過程,首先獲取images文件夾的句柄,在判斷其存在後,在其中創建新文件newLogo。
資源與文件系統的關聯
通過接口IResource.getLocationURI來獲得資源的絕對文件系統路徑。反過來,通過IWorkspaceRoot的findFilesForLocationURI或者findContainersForLocationURI來實現文件系統路徑到工作區路徑的mapping。
資源屬性
用於保存資源相關的特殊信息,包含會話級和持久級。會話級當項目關閉後失效,用於在內存中方便以名值對形式保存屬性,持久級則在文件系統中保留資源屬性,有長度限制(不大於2kb,對用於對象的持久化似乎有難度),需要註意命名時不要出現沖突。
項目級參數
可以為運行時參數Runtime preferences定義項目級範圍(Project-Scope),用於在項目範圍內對參數進行保存和操作:
//獲取ContextIScopeContext 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();
資源掛接
工作區中的資源可以來自文件系統的不同位置,通過資源掛接來實現。實例代碼:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); IPathVariableManager pathMan = workspace.getPathVariableManager(); String name = "TEMP"; IPath value = new Path("c:\temp"); //定義path變量,實現資源掛接 if (pathMan.validateName(name).isOK() && pathMan.validateValue(value).isOK()) { pathMan.setValue(name, value); } else { //invalid name or value, throw an exception or warn user } 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:tempfolder" link.getRawLocation() ==> "TEMP/folder" link.isLinked() ==> "true" IFile child = link.getFile("abc.txt"); child.create(...); child.getFullPath() ==> "/Project/Link/abc.txt" child.getLocation() ==> "c:tempfolderabc.txt" child.getRawLocation() ==> "c:tempfolderabc.txt" child.isLinked() ==> "false"
轉自:http://lengbingteng-163-com.iteye.com/blog/1118641
Eclipse RCP 資源管理(自定義Project)一 (轉)