Trabalhando com Recursos em Outros Sistemas de Arquivo

A maioria das APIs na hierarquia IResource funciona da mesma forma, independentemente do tipo de sistema de arquivo no qual os recursos estão armazenados. Entretanto, há algumas APIs específicas que devem ser evitadas ao trabalhar com recursos em outros sistemas de arquivo, porque são as únicas designadas para trabalhar com o sistema de arquivo local.

Particularmente, o método IResource.getLocation é especificado para retornar o caminho do sistema de arquivo local do recurso. Se o recurso estiver em outro sistema de arquivo, esse método não será aplicável e retornará null. O melhor é utilizar o método getLocationURI em seu lugar, que funciona independentemente do tipo de sistema de arquivo no qual o recurso está armazenado.

De forma semelhante, os métodos IProjectDescription getLocation e setLocation devem ser evitados, pois são os únicos efetivos no sistema de arquivo local. Os métodos de locais baseados em URI devem ser utilizados em seu lugar.

Cache Local

Digamos que você esteja trabalhando com recursos que não estão no sistema de arquivo local, mas você realmente precisa de um arquivo local. Por exemplo, você pode estar utilizando uma biblioteca com uma dependência em java.io.File. Nesse caso, você poderá utilizar o método IFileStore.toLocalFile para obter uma cópia local do arquivo. Observe que isso fará apenas com que um único arquivo ou diretório seja armazenado em cache localmente, em vez de uma árvore de diretório inteira. Segue um exemplo de uso do armazenamento em cache local para abrir um arquivo zip em um IFileStore:

   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);

Vinculando a Outros Sistemas de Arquivo

Você pode utilizar recursos vinculados para criar projetos que unem recursos de vários sistemas de arquivo. Basta utilizar o método IFile.createLink(URI, int, IProgressMonitor) ou IFolder.createLink(URI, int, IProgressMonitor) para criar um recurso em um projeto existente cujo conteúdo esteja armazenado em outro local de um sistema de arquivo arbitrário. Você pode até mesmo criar links abaixo de outros recursos vinculados para criar árvores de recursos arbitrárias unindo diversos sistemas de arquivos diferentes. Aqui está um exemplo simples que cria um arquivo irmão vinculado que compartilha o mesmo local de sistema de arquivo que a origem:

   IFile source = ...;//some source file
   IFile link = source.getParent().getFile(new Path(source.getName() + ".link"));
   link.createLink(source.getLocationURI(), IResource.NONE, null);