quinta-feira, 5 de janeiro de 2012

Renomeando - Parte II

Nós vimos na postagem anterior que java.io.File permite renomear arquivos do sistema operacional. A nova versão java.nio também possui este recurso que vamos explorar aqui.

Primeiro a nossa classe de exemplo (lembrem que só vai compilar se seu Java SE for 7) :

import java.nio.file.*;
import java.io.IOException;


/**
* @param arg[0] padrao a ser procurado
* @param arg[1] novo valor
* @param arg[2] arquivo ou diretorio
* @param arg[3] arquivo ou diretorio
* ....
*/
class Renomear {


  String padrao;
  String novoPadrao;


  public Renomear(String seq, String novaSeq) {
    padrao = seq;
    novoPadrao = novaSeq;
  }




  public void executar(String arquivo) {
    Path f = FileSystems.getDefault().getPath(arquivo);
    // getFileName() retorna Path por isto temos que encadear 
    // com .toString() para procurar pelo padrao
    String nomeArquivo = f.getFileName().toString();
    if (nomeArquivo.contains(padrao)) {
      // move() funciona para mover um arquivo ou para renomea-lo
      try {
        Files.move(f, f.resolveSibling( nomeArquivo.replace(padrao, novoPadrao) ));
      } catch (IOException e) {
        System.out.println(e.toString());
      }
    } 
  }


  public static void main(String[] args) {
    
    if (args.length < 3) {
      System.out.println("Uso: java Renomear \"padrao original\" \"novo padrao\" {nomeArquivo|nomeDiretorio} [{nomeArquivo|nomeDiretorio}]");
      System.exit(0); // sair
    }


    Renomear r = new Renomear(args[0], args[1]);
    for(int i = 2; i < args.length; i++)
      r.executar(args[i]); // renomeia cada arquivo da lista


  }
}

Compilamos, rodamos e (acreditem) funciona!
O padrão procurado foi "~" que será trocado por "lll". Um dos arquivos selecionado na lista está marcado com a seta. Na imagem abaixo está o resultado.

Vamos ver o que foi utilizado:
  • FileSystems.getDefault() retorna o objeto FileSystem default que utilizaremos para obter o path para o arquivo. Este método retorna FileSystem e por isto podemos utilizar o método abaixo.
  • FileSystems.getDefault().getPath(String s) converte uma String com um caminho e retorna um objeto do tipo Path que pode ser utilizado para localizar e/ou acessar um arquivo.
  • Path.getFileName() retorna um Path com o nome do arquivo (ou diretório) representado pelo objeto Path.
  • Path.toString() retorna uma String com o caminho do arquivo/diretório. Em função disto podemos usar uam chamada com Path.getFileName().toString() para obter o nome do arquivo como String.
  • Files.move() tem o seguinte formato move(Path origem, Path destino, CopyOption opcoes). Este terceiro parâmetro é opcional e nós não utilizamos. move() permite mover ou renomear o arquivo da mesma maneira que o comando mv do linux.
  • Path.resolveSibling(String s) converte uma string em um caminho, utilizando o caminho original. Por exemplo:
    • se temos um Path p com "/var/log/system"
    • Path p1 = p.resolveSibling("system.1");
    • p1 vai ser "/var/log/system.1"
Bacana!

Nenhum comentário:

Postar um comentário