Eclipse资源管理

来源:互联网 发布:淘宝开店后怎么宣传 编辑:程序博客网 时间:2024/06/05 16:39

基本概念

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.一致的信息。

资源插件提供IProjectIFolder, and IFile实现用户对这些资源类型的访问,IResource中则定义了扩展的通用操作接口,还可以使用org.eclipse.core.runtime中的接口IPath来表示工作区的资源或文件系统的访问路径。

对资源的访问与对java.io.File的访问类似,当调用对应API时,返回一个句柄,不需要在访问前确保资源是否存在。具体的,通过如下代码实现访问:

 

Java代码  收藏代码
  1. //获取工作区根  
  2.   
  3. IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot();  
  4.   
  5. //从工作区根获得项目实例  
  6.   
  7. IProject myWebProject = myWorkspaceRoot.getProject("MyWeb");  
  8.   
  9. // open if necessary  
  10.   
  11. if (myWebProject.exists() && !myWebProject.isOpen()) myWebProject.open(null);  
 

 

在对项目进行操作前,必须执行打开操作。打开项目操作将从文件系统中读取项目结构并读入内存,创建对应的项目资源树,这是一个显式的操作。

获取项目实例的再下一层,就是对项目中的文件和文件夹进行访问:

 

Java代码  收藏代码
  1. //获取文件夹实例  
  2.   
  3. IFolder imagesFolder = myWebProject.getFolder("images");  
  4.   
  5. if (imagesFolder.exists()) {  
  6.   
  7. // create a new file  
  8.   
  9. IFile newLogo = imagesFolder.getFile("newLogo.png");  
  10.   
  11.     //文件系统的创建过程  
  12.   
  13. FileInputStream fileStream = new FileInputStream("c:/MyOtherData/newLogo.png");  
  14.   
  15.     newLogo.create(fileStream, falsenull);  
  16.   
  17.     // create closes the file stream, so no worries.    
  18.   
  19. }  
 

 

上面的过程,首先获取images文件夹的句柄,在判断其存在后,在其中创建新文件newLogo

 

资源与文件系统的关联

通过接口IResource.getLocationURI来获得资源的绝对文件系统路径。反过来,通过IWorkspaceRootfindFilesForLocationURI或者findContainersForLocationURI来实现文件系统路径到工作区路径的mapping

 

资源属性

用于保存资源相关的特殊信息,包含会话级和持久级。会话级当项目关闭后失效,用于在内存中方便以名值对形式保存属性,持久级则在文件系统中保留资源属性,有长度限制(不大于2kb,对用于对象的持久化似乎有难度),需要注意命名时不要出现冲突。

 

项目级参数

可以为运行时参数Runtime preferences定义项目级范围(Project-Scope,用于在项目范围内对参数进行保存和操作:

Java代码  收藏代码
  1. //获取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.}  
  2. //参数回写  
  3.   
  4. projectNode.flush();  
 

 

资源挂接

工作区中的资源可以来自文件系统的不同位置,通过资源挂接来实现。实例代码:

Java代码  收藏代码
  1.    IWorkspace workspace = ResourcesPlugin.getWorkspace();  
  2.   
  3.    IPathVariableManager pathMan = workspace.getPathVariableManager();  
  4.   
  5.    String name = "TEMP";  
  6.   
  7.    IPath value = new Path("c:\temp");  
  8.   
  9.    //定义path变量,实现资源挂接  
  10.   
  11. if (pathMan.validateName(name).isOK() && pathMan.validateValue(value).isOK()) {  
  12.   
  13.       pathMan.setValue(name, value);  
  14.   
  15.    } else {  
  16.   
  17.       //invalid name or value, throw an exception or warn user  
  18.   
  19.    }  
  20.   
  21.    IProject project = workspace.getProject("Project");//assume this exists  
  22.   
  23.    IFolder link = project.getFolder("Link");  
  24.   
  25.    IPath location = new Path("TEMP/folder");  
  26.   
  27.    //在资源操作前需要加入验证动作  
  28.   
  29. if (workspace.validateLinkLocation(location).isOK()) {  
  30.   
  31.       link.createLink(location, IResource.NONE, null);  
  32.   
  33.    } else {  
  34.   
  35.       //invalid location, throw an exception or warn user  
  36.   
  37.    }  
  38.   
  39.    //运行结果  
  40.  link.getFullPath() ==> "/Project/Link"  
  41.    link.getLocation() ==> "c:tempfolder"  
  42.   
  43.    link.getRawLocation() ==> "TEMP/folder"  
  44.   
  45.    link.isLinked() ==> "true"  
  46.   
  47.     
  48.   
  49.    IFile child = link.getFile("abc.txt");  
  50.   
  51.    child.create(...);  
  52.   
  53.    child.getFullPath() ==> "/Project/Link/abc.txt"  
  54.   
  55.    child.getLocation() ==> "c:tempfolderabc.txt"  
  56.   
  57.    child.getRawLocation() ==> "c:tempfolderabc.txt"  
  58.   
  59.    child.isLinked() ==> "false"  
 
原创粉丝点击