在不考虑用于存储资源的文件系统类型的情况下,IResource 层次结构中的大部分 API 的工作方式是相同的。但是,在处理其他文件系统中的资源时,需要避免使用一些特定的 API,这是因为它们仅适用于本地文件系统。
尤其是,IResource.getLocation 方法仅返回资源的本地文件系统路径。如果该资源在某些其他文件系统中,则此方法不适用,它将返回 null。最好改为使用 getLocationURI 方法,无论资源存储在哪种类型的文件系统中,此方法都适用。
同样,由于 IProjectDescription 的 getLocation 和 setLocation 方法仅在本地文件系统才有效,所以应该避免使用它们。应该改为使用基于 URI 的位置方法。
假定您正在处理不在本地文件系统中的资源,但您确认需要本地文件。例如,您可能正在使用依赖于 java.io.File 的库。在这种情况下,可以使用 IFileStore.toLocalFile 方法来获取文件的本地副本。请注意,这只会导致在本地对一个文件或目录进行高速缓存,而不会对整个目录树进行高速缓存。以下示例说明如何使用本地高速缓存来打开 IFileStore 中的 ZIP 文件:
IFileStore store = ...;//some file store java.io.File file = store.toLocalFile(EFS.NONE, null); if (file == null) { //we are not a local file store, so we need to cache a local copy file = store.toLocalFile(EFS.CACHE, null); } java.util.zip.ZipFile zip = new java.util.ZipFile(file);
可以使用链接的资源来创建从多个文件系统获取资源的项目。您只需使用 IFile.createLink(URI, int, IProgressMonitor) 或 IFolder.createLink(URI, int, IProgressMonitor) 方法来在现有项目中创建一个资源并将其内容存储在任意文件系统中的另一位置。您甚至可以在其他链接的资源下面创建链接以创建从许多不同文件系统中获取资源的任意资源树。下面是一个简单的示例,它创建同代链接文件,该文件与源共享同一文件系统位置:
IFile source = ...;//some source file IFile link = source.getParent().getFile(new Path(source.getName() + ".link")); link.createLink(source.getLocationURI(), IResource.NONE, null);