Работа с ресурсами в других файловых системах

Большинство API в иерархии IResource работают одинаково, независимо от типа файловой системы, в которой хранятся ресурсы. Однако, есть некоторые API, использование которых следует избегать при работе с ресурсами в других файловых системах, потому что они предназначены только для работы с локальной файловой системой.

В частности, метод IResource.getLocation возвращает путь локальной файловой системы ресурса. Если ресурс расположен в другой файловой системе, тогда этот метод не применим и будет возвращать значение null. Лучше вместо этого использовать метод getLocationURI, который работает независимо от типа файловой системы, в которой хранится ресурс.

Подобным образом, не следует использовать методы IProjectDescription getLocation и setLocation, потому что они эффективны только в локальной файловой системе. Вместо них должны использоваться методы, работающие с расположением на основе URI.

Локальное кэширование

Предположим, вы работаете с ресурсами, расположенными не в локальной файловой системе, но вам необходим локальный файл. Например, вы используете библиотеку, зависящую от java.io.File. В этом случае можно применить метод IFileStore.toLocalFile для получения локальной копии файла. Заметьте, что что это приведет к локальному кэшированию только одного файла или каталога, а не всего дерева каталога. Ниже приведен пример использования локального кэширования для открытия сжатого файла в IFileStore:

   IFileStore store = ...;//хранилище файлов
   java.io.File file = store.toLocalFile(EFS.NONE, null);
   if (file == null) {
      //мы не сохраняем локальный файл, поэтому необходимо кэшировать локальную копию
      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 = ...;// некоторый исходный файл
   IFile link = source.getParent().getFile(new Path(source.getName() + ".link"));
   link.createLink(source.getLocationURI(), IResource.NONE, null);