sábado, 31 de dezembro de 2011

Renomear arquivos

Vamos dizer que você baixou um torrent. Os arquivos do torrent foram todos acrescidos de um sufixo com o nome do uploader e os espaços foram trocados por "+".  Queremos retirar este sufixo e trocar os "+" por espaços.

import java.io.File;
import java.io.IOException;

/**
* renomeia um arquivo, remove um padrão e substitui por outro
* @param arg[0] arquivo ou diretorio
* @param arg[1] padrao a ser procurado
* @param arg[2] novo valor
* @param arg[3] opcional. se igual a "sub" procura nos subdiretórios
*/
public class RenomeiaArquivos {
  String padrao;
  String novoPadrao;
  boolean subDiretorios = false;

  public RenomeiaArquivos(String seq, String novaSeq, boolean sub) {
    padrao = seq;
    novoPadrao = novaSeq;
    subDiretorios = sub;
  }

  private String adequaString(String original) {
    return original.replace(padrao, novoPadrao);
  }

  private boolean renomeiaArquivo(File f) throws IOException {
    if (f.getName().contains(padrao)) {
      String novoNome = adequaString(f.getAbsolutePath());
      return f.renameTo(new File(novoNome));
    }
    return false;
  }

  private void renomeiaDiretorio(File f) throws IOException {
    String[] lista = f.list();
    File arq;
    for(int i=0; i < lista.length; i++) {
     arq = new File(lista[i]);
     if (arq.isFile()) {
       renomeiaArquivo(arq);
     } else if (subDiretorios) {
       System.out.println("Dir>"+arq.getName());
       renomeiaDiretorio(arq);
     }
    }
  }

  private void executar(String nomeArquivo) throws IOException {
    File f = new File(nomeArquivo);
    System.out.println("Renomeando "+f.getName());
    if (f.isFile()) {
      renomeiaArquivo(f);
    } else {
      renomeiaDiretorio(f);
    }
  }

  public static void main(String[] args) {

    if (args.length < 3) {
      System.out.println("Uso: java RenomeiaArquivos {nomeArquivo|nomeDiretorio} \"padrao original\" \"novo padrao\" [sub]");
      System.exit(0); // sair
    }

    boolean sub = (args.length > 3) && (args[3].equalsIgnoreCase("sub"));
    RenomeiaArquivos ren = new RenomeiaArquivos(args[1], args[2], sub);
    try {
      ren.executar(args[0]);
    } catch (IOException e) {
      System.out.println(e.toString());
    }
  }

}

Testem e descubram o erro deste programa.

Notem que ele compila e consegue ser executado. Este exemplo rodamos no linux com open-jdk.
Seria interessante que este programa utilize regex para podermos usar wildcard para o nome de arquivo.

Nenhum comentário:

Postar um comentário