首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

23.2.7  路径

在工作空间API中,路径通常作为方法的参数和返回值使用。路径指的是由标准的分隔符(/)分隔开的一个字符串,该字符串可以以分隔符开头和/或分隔符结尾。驱动器标识符前缀是可有可无的,例如D:或Cork/Data:都是合法的。路径值可以是相对路径,或者是指向资源的绝对位置的引用。

表23-2对不同类型的路径值进行了比较,这里以一个名为a.proj的项目为例,列举了您可以从像aFold这样的文件夹中获取的路径值。

表23-2  路径值

路 径 类 型

方    法

相对于工作空间位置

IResource.getFullPath()

/a.proj/aFold

相对于项目

IResource.getProjectRelativePath()

aFold

文件系统中的物理

位置

IResource.getLocation()

e:/eclipse/workspace/a.proj/aFold

文件系统中的原始物理位置

IResource.getRawLocation()

e:/eclipse/workspace/a.proj/aFold

注意:

getLocation与getRawLocation方法的差别是非常微妙的。如Javadoc中所描述的那样:

如果资源是一个已存在的项目,返回的路径将等于项目描述中的位置路径。如果资源是在一个已经打开的项目中的链接资源,返回的路径将等于链接资源创建时的位置路径。其他情况下,getRawLocation与getLocation方法的返回值相同。

惟一值得注意的不同之处是,对于默认位置下(在工作空间目录中)的项目,getRawLocation方法将返回null。

在获取引用或创建资源句柄时,您可以使用路径来定义资源的位置,例如使用getFile(IPath path)或getFolder(IPath path)方法;在复制或移动资源时,您可以将路径作为参数传递;当您查询变量的值,比如资源、工作空间根目录和平台的位置时,路径可以作为返回值。

尽管工作空间API包括IPath接口,但您应该使用Path类的构造方法创建一个新的路径。

IPath myPath = new Path("my/Path/");

IPath myPatLocation = new Path("D:\", "my/Path/");

Path类的构造函数可以接收一个String类型的路径值作为参数,也可以接收两个String类型的值,第一个表示驱动器,第二个表示路径。如果该String类型的路径值的每段(通过分隔符隔开)是有效的,则该路径是有效的。而对于路径中的每段字符,如果它是非空的而且不包含冒号(:),并且不以空格开头或结尾,则该段字符是有效的。如果路径值中包括一个反斜杠(\),它将会被自动转换为正斜杠(/)。

IPath接口所提供的方法,允许您对路径值进行操作。您可以查阅相关的Javadoc或源代码以获取可用方法的更多详细信息。

注意:

本书配套光盘的资源编程示例中,Navigator视图操作部分包含了路径操作的代码。这些路径操作在Navigator视图中显示了选中的资源的各种路径表示。

23.2.8  文件夹和文件

创建文件夹和创建文件使用的是相同的编程模式:首先,获取资源的句柄,然后判断该资源是否存在,如果不存在,则可以创建该资源。通常,您可以从文件夹或项目中获得一个文件夹或文件的句柄。如果请求的是一个已经存在资源,那么您已经获得一个可以直接使用的资源。如果请求的资源并不存在,那么需要创建该资源。但有一个前提必须满足:该资源的父资源必须是可访问的。

下面的代码根据名称获取项目的一个文件夹,如果该文件夹不存在,则试图创建该文件夹。

private void createFolderInProject(

IProject project, String folderName) {

IFolder newFolder = project.getFolder(folderName);

if (!newFolder.exists()) {

try {

newFolder.create(true, true, null);

} catch (CoreException e) {

// Deal with exception.

}

}

}

在获取句柄、创建文件夹的过程中,文件系统有可能已经具有一个同名的文件夹,或者所给的文件夹名不合法。如前面的“工作空间资源句柄”一节所讨论的那样,您必须考虑自己的资源创建策略。在这个例子中,您可以先检查项目是否已经与文件系统同步,但这也只能避免一些可能的麻烦。

当文件系统中包含未被工作空间所感知的资源时,您所设计的创建策略,需要捕获或避免创建错误。对于这一点,Workbench New Folder向导使用了一种混和策略:在处理创建请求之前,先检查文件夹名是否合法,如果文件夹已经存在于文件系统中,则创建失败。

文件的创建及其内容的设定可以通过工作空间API来实现。IFile API支持使用输入流来获取、设定和添加文件的内容,相应的方法如下所示:

●       getContents方法:获取文件内容的输入流。

●       setContents方法:通过传入一个输入流参数,或者IFileState参数来设定文件的内容。

●       appendContents方法:向当前文件的内容追加一个输入流。

下面的代码展示了如何在传入参数所指定的文件夹下创建一个文件。如果文件已经存在,它的内容将被替换。其中的getInitialContents方法用来提供新文件的内容或者替换现有文件的内容。

private void createFi1eInFo1der2(IFo1der folder) {

IFile newFile = folder.getFi1e("new_Fi1e.txt");

try {

if (newFile.exists())

newFile.setContents(

getInitialContents(),

true, false, null);

else {

java.io.Fi1e systemFile =

newFile.getLocation().toFile();

if (systemFile.exists() {

// Skip create -- in file system.

// Could refreshLocal on parent at this point.

} else {

newFile.create(getInitialContents(), false, null);

}

}

} catch (CoreException ce) {

// Failed.

}

}

// Return input stream used to create initial file contents.

private InputStream getInitialContents() {

StringBuffer sb = new StringBuffer();

sb.append("My New File Contents");

return new ByteArrayInputStream(sb.toString().getBytes());

}

这段代码所使用的保证文件可以被创建的方法,已经超出了工作空间API的能力。它通过检查文件系统来判断文件是否已经存在。如果文件已经存在于文件系统中,但不在工作空间中,则跳过该文件的创建和内容设定过程。

23.2.9  链接资源

资源不一定总是物理存在于项目的文件系统树中。在项目的根目录下,您可以创建链接资源。链接资源指的是一个指向文件夹或文件的引用,而这些文件夹或文件并不物理存在于项目中。链接资源既可以通过New Folder或New File向导创建,也可以利用工作空间API创建。

下面的程序将会在项目中创建一个链接文件夹和一个链接文件。

IPath path = new Path("E:/SharedResources/This");

IFolder folder = project.getFo1der("aFo1der");

if (!folder.exists())

try {

folder.createLink(path,IResource.NONE,nul1);

} catch (CoreException e) {

e.printStackTrace();

}

path = new Path("E:/SharedResources/That.txt");

IFile file = project.getFi1e("aFi1e.txt");

if (!file.exists())

try {

fi1e.createLink(path,IResource.ALLOW_MISSING_LOCAL,nul1);

} catch (CoreException e) {

e.printStackTrace();

}

createLink方法包含一个ALLOW_MISSING_LOCAL参数,该参数表明当欲链接的目标文件不存在时,仍允许创建该链接文件。这一选项同样适用于文件夹。

如果您正在操作链接资源,也许需要考虑一些特殊的处理选项。如果请求一个复制或移动操作,您可以使用IResource.SHALLOW参数指明,复制的是链接,而非所链接的资源。同样,您也可以通过isLinked方法询问资源是否是一个链接资源。

如果一个文件夹或文件在工作空间中被其他资源链接,您可以通过IWorkspaceRoot来查找这些链接的位置。您只需要将一个绝对路径(e:\folderName或e:\folder\fileName.txt)作为findContainersForLocation方法或findFilesForLocation方法的IPath参数传入。将一个文件夹的IPath参数传入findContainersForLocation方法中,可以返回一个容器数组,其中每个容器中均链接了该文件夹。而将一个文件的IPath参数传入findContainersForLocation方法中,也可以返回一个容器数组,其中每个容器中均链接了该文件。这些方法对于非链接的资源也有效,但是返回的结果意义不大;这与getParent方法的情形是一样的。

23.2.10  访问资源树中的资源

当您需要查找一个项目、文件夹甚至整个工作空间中的所有资源时,您可以使用工作空间API中的IResourceVisitor或IResourceProxyVisitor接口。通过这些接口,您可以对资源树上的某个节点进行操作,而且可以访问该节点的所有子节点。

为了操作资源树中给定节点的所有元素,您可以定义一个实现IResourceVisitor或IResourceProxyVisitor接口的类。这两个接口均只定义了一个方法,即visit方法。在您处理资源树中每个元素以及子元素时,需要调用该visit方法。

这两个接口之间的差别并不复杂:IResourceVisitor只需给定一个要处理的IResource资源实例,而IResourceProxyVisitor则要给定一个真实的IResourceProxy实例。该IResourceProxy实例允许您对诸如名称、类型之类的属性进行检查,但其开销要远小于创建一个真实的IResource实例。这样,可以大大减少处理资源树的开销。IResourceProxy的属性可以帮助您决定是继续访问下一个代理对象,还是需要一个真实的IResource实例。如果需要真实的资源,只需调用IResourceProxy.requestResource方法即可。

您可以向IResource.accept方法传入感兴趣的资源节点的IResourceVisitor或IResourceProxyVisitor实例,来处理资源树。accept方法存在多种签名,除了访问者参数,其他参数可以用来指导如何处理访问者。

下面的程序展示了IResourceVisitor接口的一种简单实现。IResourceProxyVisitor接口的实现几乎完全一样,惟一的区别在于传入给visit方法的参数类型不同。

private void visitResourceTree(IResource resource) {

IResourceVisitor visitor = new IResourceVisitor() {

public boolean visit(IResource res) {

// Process the resource.

// ... Your logic here ...

// By returning true, you are saying you want

// to process the children.

return true;

};

};

try {

resource.accept(visitor);

} catch (CoreException e) {

// Problem during visit processing.

}

}

当您希望处理工作空间中的所有或者部分内容时,您可以实现IResourceVisitor或IResourceProxyVisitor接口。访问者的基本功能就是允许您沿着工作空间资源树“行走”。它所返回的boolean值将指导访问者架构继续访问当前资源的子节点。

注意:

工作空间API还包含一个IResourceDeltaVisitor接口。该接口支持处理作为IResourceDelta的一部分所提供的资源树。关于该接口的详细内容请参见本章后续部分的“处理工作空间更改事件”一节,以及第24章中的“定义和实现增量项目构建器”一节。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论