1. 程式人生 > >Eclipse RCP 資源管理(自定義Project)一 (轉)

Eclipse RCP 資源管理(自定義Project)一 (轉)

com time projects 工作臺 回寫 resource rep abc 管理

基本概念

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)一 (轉)