[code]Exception in thread “main” java.lang.Error: Unresolved compilation problems:
The method renameTo(File) in the type File is not applicable for the arguments (String)
ok cannot be resolved
Minha intenção aqui não é de responder ao criador do tópico, e sim a de ajudar a quem procura por este tipo de solução.
Somente cheguei no resultado postado, pois tive a mesma dificuldade que ele. Postei neste tópico, pois foi o primeiro que apareceu na pesquisa com as palavras chave “guj renomear arquivo”.
Eu acredito que o propósito deste forum é colaboração e não sarcasmo.
Realmente fui soberbo e quebrei a cara. Peço perdão por isso.
Ainda bem que a discussão chegou nesse ponto, pois o código que postei é estúpido.
Fiz a alteração que você sugeriu, mas não tive exito.
Quando informo o target como “xml” e o source como “txt” funciona, mas quando coloco o target como “prod” e source como “homo” não funciona.
Ex.: nome do arquivo estab_prod.xml --> deveria mudar para estab_homo.xml, mas continua como prod e retorna false.
O que pode estar errado?
Devo informar a extensão?
package br.inf.gati.file;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
public class RenameFile {
/**
* target - palavra a ser substituida
* source - valor que vai substituir o target
*/
private String target, source, local = null;
private ArrayList<String> lista = new ArrayList<String>();
public RenameFile(String[] args) {
target = args[0];
source = args[1];
local = args[2];
System.out.println("Target: " + target);
System.out.println("Source: " + source);
System.out.println("Local : " + local + "\n\n\n\n");
readFiles();
renameFiles();
}
public RenameFile(String target, String source, String local) {
this.target = target;
this.source = source;
this.local = local;
}
/**
* @param args
* args[0] - target to be replaced
* args[1] - source for new value
* args[2] - local where the replace name file will be executed
*/
public static void main(String[] args) {
new RenameFile(args);
}
public void readFiles() {
if (local == null || local.equalsIgnoreCase("")){
System.err.println("Valor inválido para o parâmetro #3 - Local!!!");
return;
}
if (source == null || source.equalsIgnoreCase("")){
System.err.println("Valor inválido para o parâmetro #2 - Source!!!");
return;
}
if (target == null || target.equalsIgnoreCase("")){
System.err.println("Valor inválido para o parâmetro #1 - Target!!!");
return;
}
File local = new File(this.local);
if (!local.exists()){
System.err.println("O diretório especificado no argumento #3 não existe!!!");
return;
}
for(File file : local.listFiles()){
if (file.getAbsolutePath().contains(target)){
lista.add(file.getAbsolutePath());
}
}
}
public void renameFiles() {
for(String aux : lista){
new File(aux.toString()).renameTo(new File(aux.replaceAll(target, source).toString()));
}
}
}
Pretendo renomear todos os arquivos com uma expressão em comum.
Implementei todas as suas sugestões e o resultado foi o seguinte:
Target: prod
Source: homo
Local : C:\AMBIENTE_TESTE\nfe\servicemix-prod-entrada\conf
Original true
Renomeado false
false
Original true
Renomeado false
false
Original true
Renomeado false
false
Original true
Renomeado false
false
Original true
Renomeado false
false
Original true
Renomeado false
false
Original true
Renomeado false
false
Original true
Renomeado false
false
Original true
Renomeado false
false
Original true
Renomeado false
false
Quando você tenta informar o caminho absoluto de uma vez, ele não acerita. O motivo desconheço.
Mas quando você instancia FILE informando o Path e o name separadamente, ai funciona.
Segue exemplo:
File renomeado = new File(aux.getParent(), aux.getName().replaceAll(target, source));
Segue resultado:
Target: homo
Source: prod
Local : C:\AMBIENTE_TESTE\nfe\servicemix-prod-entrada\conf
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Segue o fonte completo:
package br.inf.gati.file;
import java.io.File;
import java.io.FilePermission;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.Writer;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.filechooser.FileSystemView;
public class RenameFile {
/**
* target - palavra a ser substituida
* source - valor que vai substituir o target
*/
private String target, source, local = null;
private ArrayList<File> lista = new ArrayList<File>();
public RenameFile(String[] args) {
target = args[0];
source = args[1];
local = args[2];
System.out.println("Target: " + target);
System.out.println("Source: " + source);
System.out.println("Local : " + local + "\n");
readFiles();
renameFiles();
}
public RenameFile(String target, String source, String local) {
this.target = target;
this.source = source;
this.local = local;
}
/**
* @param args
* args[0] - target to be replaced
* args[1] - source for new value
* args[2] - local where the replace name file will be executed
*/
public static void main(String[] args) {
new RenameFile(args);
}
public void readFiles() {
if (local == null || local.equalsIgnoreCase("")){
System.err.println("Valor inválido para o parâmetro #3 - Local!!!");
return;
}
if (source == null || source.equalsIgnoreCase("")){
System.err.println("Valor inválido para o parâmetro #2 - Source!!!");
return;
}
if (target == null || target.equalsIgnoreCase("")){
System.err.println("Valor inválido para o parâmetro #1 - Target!!!");
return;
}
File local = new File(this.local);
if (!local.exists()){
System.err.println("O diretório especificado no argumento #3 - local, não existe!!!");
return;
}
File[] list = local.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.contains(target);
}
});
lista.addAll(Arrays.asList(list));
}
public void renameFiles() {
for(File aux : lista){
File original = aux;
File renomeado = new File(aux.getParent(), aux.getName().replaceAll(target, source));
System.out.println("Original " + original.exists());
System.out.println("Renomeado " + renomeado.exists());
System.out.println(original.renameTo(renomeado));
}
}
}
Muito obrigado pela ajuda e me perdoe pela grosseria, tanto no trato como no código.
Valeu mesmo.
Segue um código que renomeia (e fica revesando baseado no arquivo criado).
Lembrando que, se não tiver permissão para alterar o nome, não vai funcionar. Pode utilizar os métodos de File para verificar se pode alterar ou não.
[code]public class Main {
/**
* @param args
*/
public static void main(String[] args) {
//Definindo o nome do arquivo
String filePath = "c:\\";
String aFileName = "a";
String bFileName = "b";
String fileExtension = ".txt";
//Nomes do arquivo.
String aFile = filePath + aFileName + fileExtension;
String bFile = filePath + bFileName + fileExtension;
//Verificador de exisência do arquivo.
boolean aFileExists = true;
File f = new File(aFile); //Cria descritor do arquivo a.txt
if(!f.exists()) { //Se arquivo a.txt não existir
f = new File(bFile); //Trocar pelo descritor do arquivo b.txt
if(!f.exists()) { //Se não existir nem o arquivo b.txt
System.out.println("Nenhum arquivo existe. Criar arquivo");
try {
f.createNewFile(); //Cria o arquivo b.txt (que será renomeado para a.txt)
} catch (IOException e) {} //Trate esta exceção como preferir.
}
aFileExists = false; //Marcar que arquivo a.txt não existe.
}
//Ação de renomear arquivo baseado em quem é válido.
if(f.renameTo(aFileExists ? new File(bFile) : new File(aFile))) {
System.out.println("file renamed to " + (aFileExists ? bFile : aFile));
}
//Se não imprimir o texto acima significa que não foi possível renomear o arquivo por algum motivo.
}
Sim, concordo. Apenas fiz uma pequena piada, mas como você se doeu, resolvi olhar com mais atenção seu código (ser colaborativo) e notei que você não renomeia um arquivo. Você cria um outro arquivo apagando o anterior e seu conteúdo se perde no caminho. Ou seja, apenas aparentemente existe o renomeio do arquivo.
O primeiro ponto que me chamou a atenção é a existência de código desnecessário como:
import javax.sound.midi.SysexMessage;
//e
Writer arquivo = new FileWriter(newFile); //Este me chamou muito a atenção!!!
Outro ponto que me chamou a atenção foram as chamadas aos métodos createNewFile e deleteOnExit. O fato deles serem chamados sem haver algo entre eles que “copie o conteúdo” me indicou que não estava renomeando mas sim criando um arquivo TOTALMENTE novo e diferente do original e deletando o original e todo seu conteúdo.
Como testei? Criei um arquivo que possuia informações e executei tua classe. Resultado? O arquivo novo estava em branco.
Para renomear um arquivo, há uma forma razoavelmente simples de fazer:
new File("arquivoOriginal").renameTo(new File("arquivoRenomeado"));
Seu código funciona aqui. Faça o seguinte, antes de renomear, verifique quais arquivos existem, tanto target quanto source (obs.: Acho que o conceito de target e source estão invertidos).
public void renameFiles() {
for(String aux : lista){
File original = new File(aux);
File renomeado = new File(aux.replaceAll(target, source));
System.out.println("Original " + original.exists());
System.out.println("Renomeado " + renomeado.exists());
System.out.println(original.renameTo(renomeado));
}
}
Outra coisa que não entendi bem no seu código é este for:
[code]
for(File file : local.listFiles()){
if (file.getAbsolutePath().contains(target)){
lista.add(file.getAbsolutePath());
}
}
[/code] Pelo que entendo, você quer ser capaz de renomear diversos arquivos, desde que possuam característica similar no nome. É isso?
Se sim, pode fazer diferente:
//Altere a lista
private ArrayList<File> lista = new ArrayList<File>();
//Altere o loop onde obtem a lista de arquivos a serem renomeados
File[] list = local.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.contains(target);
}
});
lista.addAll(Arrays.asList(list));
//Altere o método que renomeia
public void renameFiles() {
for(File aux : lista){
File original = aux;
File renomeado = new File(aux.getAbsolutePath().replaceAll(target, source));
System.out.println("Original " + original.exists());
System.out.println("Renomeado " + renomeado.exists());
System.out.println(original.renameTo(renomeado));
}
}
Cara, este código que eu modifiquei do teu funcionou perfeitamente:
package br.inf.gati.file;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
public class RenameFile {
/**
* target - palavra a ser substituida source - valor que vai substituir o
* target
*/
private String target, source, local = null;
private ArrayList<File> lista = new ArrayList<File>();
public RenameFile(String[] args) {
target = args[0];
source = args[1];
local = args[2];
System.out.println("Target: " + target);
System.out.println("Source: " + source);
System.out.println("Local : " + local + "\n\n\n\n");
readFiles();
renameFiles();
}
public RenameFile(String target, String source, String local) {
this.target = target;
this.source = source;
this.local = local;
}
/**
* @param args
* args[0] - target to be replaced args[1] - source for new value
* args[2] - local where the replace name file will be executed
*/
public static void main(String[] args) {
// Não queria rodar com argumentos ;)
String[] valores = new String[] {
"testeme.docx",
"testado.docx",
"C:\\rename"
};
new RenameFile(valores);
}
public void readFiles() {
if (local == null || local.equalsIgnoreCase("")) {
System.err.println("Valor inválido para o parâmetro #3 - Local!!!");
return;
}
if (source == null || source.equalsIgnoreCase("")) {
System.err
.println("Valor inválido para o parâmetro #2 - Source!!!");
return;
}
if (target == null || target.equalsIgnoreCase("")) {
System.err
.println("Valor inválido para o parâmetro #1 - Target!!!");
return;
}
File local = new File(this.local);
if (!local.exists()) {
System.err
.println("O diretório especificado no argumento #3 não existe!!!");
return;
}
File[] list = local.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.contains(target);
}
});
lista.addAll(Arrays.asList(list));
}
public void renameFiles() {
for (File aux : lista) {
File original = aux;
File renomeado =
new File(aux.getAbsolutePath()
.replaceAll(target, source));
System.out.println("Original " + original.exists());
System.out.println("Renomeado " + renomeado.exists());
System.out.println(original.renameTo(renomeado));
}
}
}
Se teu código está como o meu, verifique se você possui permissões para renomear os arquivos na pasta indicada, ou mesmo se possui permissões para renomear os arquivos (ou se havia alguma diferença entre o teu código e o meu código).
Infelizmente, pelo Java você só é capaz de saber se renomeou ou não mas não o motivo que levou a isso… (este é um caso típico em que eu preferia que fosse lançada uma Exception)
Segue o resultado da console
Target: testeme.docx
Source: testado.docx
Local : C:\rename
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
[quote=juceliohv]tem uma diferença na hora de passar os parâmetros.
você passou o nome completo do arquivo, com extensão.
String[] valores = new String[] {
"testeme.docx",
"testado.docx",
"C:\\rename"
};
eu passo apenas a expressão que deve ser trocada.
por exemplo:
String[] valores = new String[] {
"eme",
"ado",
"C:\\rename"
};
[/code][/quote]
Troquei os parâmetros para:
[code]String[] valores = new String[] {
"ado", //Estava *testado.docx
"eme", //Quero que volte a ser *testeme.docx
"C:\\rename"
};[/code]e o resultado foi:[code]Target: ado
Source: eme
Local : C:\rename
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Original true
Renomeado false
true
Não tinha dúvidas que funcionaria, apenas fiz o teste para obter a saída. Ainda acho que é algum problema de permissão para renomear o arquivo.
[EDIT]
Só uma dúvida, os arquivos estão em uso? Vi que são arquivos de configuração. Por acaso o programa que lê essas configurações não está em execução?