链接的资源

先前对资源和文件系统的讨论(将资源映射至磁盘位置)假定项目中的所有资源都位于文件系统中的同一位置。这通常是正确的。但是,提供了工作台中的链接的资源这一概念,以便可以将项目中的文件和文件夹存储在文件系统中的项目位置之外的位置。 

链接的资源必须将项目作为它们的父代资源。它们可以虚拟方式存在于文件系统中的任何位置。它们可以驻留在项目位置外部,甚至可以驻留在另一个项目中。对链接资源的位置限制很少。可以使用 IWorkspace.validateLinkLocation 方法来确保给定位置对于创建链接的资源是有效的。

链接的资源是使用 IFolder.createLinkIFile.createLink 方法创建的。要使用程序来确定给定资源是否是链接的资源,可以使用 IResource.isLinked 方法。注意,此方法将只对链接的资源而不会对链接的资源的子代返回 true

除了用于创建链接的资源和了解资源是否已链接的这些特殊方法之外,当处理链接的资源时,可以使用普通工作区 API。在大多数方面,链接的资源与工作区中的其它任何资源的行为是完全相同的。但是,当移动、复制或删除链接的资源时具有一些限制。有关个别操作及其限制的信息,参见 IResource 及其子类。

路径变量

当指定链接的资源的位置时,可以使用路径变量。路径变量是为文件系统中的位置定义快捷方式的简单映射(字符串 -> IPath)。通过减少使用硬编码的绝对文件系统路径的位置数,变量很容易管理链接的资源。   

路径变量以几种方式使用户能够更顺利地管理链接的资源:

此列表中的最后一项值得解释一下。当用户在项目中创建链接的资源时,就会将该链接的资源的描述添加至项目位置中的项目描述文件(“.project”)。通过使用路径变量,用户可以共享项目(通过复制项目的内容或者使用资源库),并重新定义变量以适合每个单个工作站。例如,一个用户可能会将外部资源存储在一个系统的 c:\temp 下面,而正在使用 Unix 的另一个用户可能会将相同的资源存储在 /home/username/tmp 中。在每个工作区上定义路径变量(TEMP=c:\tempTEMP=/home/userb/tmp)允许用户解决此差别,并按原样与链接的资源共享项目。

IPathVariableManager 定义用于创建、处理和解析路径变量的 API。它还提供了一些方法来在创建变量之前验证变量名和值,并安装在更改路径变量定义时要通知的侦听器。可以使用 IWorkspace.getPathVariableManager 来获取此类的实例。有关更多详细信息,参见本节末尾的代码示例。

可以使用 IResource.getRawLocation 方法来了解链接的资源的不可解析的位置。即,获取实际路径变量名而不是将它解析为它的值。如果没有使用路径变量定义资源位置,则 getRawLocation 方法与 getLocation 方法的作用完全相同。

断开的链接

使用程序来处理资源的客户机需要了解可能会存在断开的链接。当链接的资源的位置不存在,或者指定为相对于未定义的路径变量时,就会存在断开的链接。当使用 IResource 协议时,存在下列特殊情况:

与已安装的插件的兼容性

某些插件可能不能处理链接的资源,所以具有许多机制可用来禁用它们。如果您正在编写一个插件,该插件确实需要所有项目的内容都位于项目的缺省位置,则可以使用这些机制来防止用户在不希望出现链接的资源的地方创建链接的资源。

第一种机制称为项目性质否决。如果定义了您自己的项目性质,则可以在性质定义中指定性质与链接的资源不兼容。下面是采用性质否决的性质定义的一个示例:

<extension
	id="myNature"
	name="My Nature"
	point="org.eclipse.core.resources.natures">
	<runtime>
		<run class="com.xyz.MyNature"/>
	</runtime>
	<options allowLinking="false"/>
</extension>   

防止创建链接的资源的第二种机制是小组 hook。如果您定义您自己的资源库实现,则可以利用 org.eclipse.core.resources.teamHook 扩展点来防止在共享资源库类型的项目中创建链接的资源。缺省情况下,资源库供应商允许链接的资源位于连接至资源库的项目中。 

如果资源库支持是由不知道链接的资源的较旧插件提供的,则您将不能在那些项目中创建链接的资源。 

最后,有一个首选项设置可用来对整个工作区禁用链接的资源。前面两种否决机制只对每个项目起作用,而此首选项会影响工作区中的所有项目。要使用程序来设置此首选项,可使用首选项 ResourcesPlugin.PREF_DISABLE_LINKING。此设置通常将与主要功能首选项覆盖机制一起用来允许 Eclipse 安装的主要功能部件关闭链接的资源。注意,即使在设置了的情况下,用户或插件也可以通过关闭首选项来覆盖此项。

代码中的链接的资源

让我们详细讨论在代码中使用链接的资源的一些示例。我们将从定义路径变量开始:

    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
   }
现在,我们可以创建相对于已定义的路径变量的链接资源:
   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
   }
就是这样。现在,您的工作区中就具有了一个位于“c:\temp\folder”中的称为“Link”的已链接文件夹。

让我们以此链接资源上的某些代码片段结束,以便说明与链接资源相关的其它方法的行为:

   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"
   

Copyright IBM Corporation and others 2000, 2003.