Renomear arquivo

Bom dia

Tento renomear um arquivo e não renomeia, fiz o seguinte:

public boolean RenomearArquivo (String arquivo) {
		
		File arquivo1 = new File(arquivo);
		File arquivo2 = new File(arquivo + "_rep" );
		arquivo1.renameTo(arquivo2)
}

Os arquivos ficam com os seguintes nome
arquivo1 = c:\arq\arq.aut
arquivo2 = c:\arq\arq.aut_rep

e não renomeia…

Alguém sabe o porque?

Claro.

Pegue o nome do arquivo 1 e renomei o arquivo 2.
Assim:

public boolean RenomearArquivo (String arquivo) {   
           
        File arquivo1 = new File(arquivo);   
        File arquivo2 = new File(arquivo);   
        arquivo1.renameTo(arquivo1.getName().concat("_rep"));   
}

Ps: possivelmente, após _rep você terá de adicionar a extensão do seu arquivo, algo como “_rep.txt”.

Edit: não dê nomes a métodos que iniciem com letra maíuscula, foge do padrão Java.

Abraços.

Obrigado…

Fiz o teste e não funcionou!

[quote=jony]Obrigado…

Fiz o teste e não funcionou![/quote]

O que seria não funcionar? Qual o resultado apresentado á você?!

[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

[quote]

Eu não havia visto que o renameTo aceita somente File.
Bom, tente o seguinte então:

public boolean RenomearArquivo (String arquivo) {   
           
        File arquivo1 = new File(arquivo);   

        String[] s = arquivo.split(".");
        String file = s[0].concat("_rep").concat(s[1]);

        File arquivo2 = new File(file);   
        arquivo1.renameTo(arquivo2)   
} 

Lembrando de adicionar a extensão deseja após _rep.

Abraços.

Bom dia amigos,

No meu caso, deu certo desta forma!

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;

import javax.sound.midi.SysexMessage;

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

	private void renameFiles() {
		
		for(String aux : lista){
			
			
			try {
				File oldFile = new File(aux);			
				File newFile = new File(oldFile.getParent() , oldFile.getName().replaceAll(target, source));
				newFile.createNewFile();  
		        Writer arquivo = new FileWriter(newFile);  
		        if (oldFile.exists()){
		        	System.out.println("Old name: " + oldFile.getName() + "\nNew name: " + newFile.getName());
		        	System.out.println(oldFile.renameTo(newFile) + " Existe? " + newFile.exists() + "\n" +
		        			"nome: " + newFile.getAbsoluteFile() + " \n");
		        	oldFile.deleteOnExit();		        	
		        }
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
		
	}

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

Espero ter ajudado.

Prezado Wellington Nogueira,

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.

Boa tarde Wellington.nogueira,

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

Exatamente,

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

Não renomeou.

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"  
            };  

Confirmei minha suspeita,

Quando passei o nome completo funcionou.

Target: log4j-prod.xml
Source: log4j-homo.xml
Local : C:\AMBIENTE_TESTE\nfe\servicemix-prod-entrada\conf

Original true
Renomeado false
true

Vou tentar extrair o nome em uma string, aplicar o replace e depois aplicar ao FILE.

Verifiquei, é não há nehum processo utilizando os arquivos.

O segredo está em informar a extensão. Mas não sei por que?

Target: prod.xml
Source: homo.xml
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

Consegui Wellington,

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.
	
	
}

}
[/code]

[quote=juceliohv]Espero ter ajudado.[/quote]E eu espero que o criador deste post (de 2011) não tenha esperado tanto tempo por uma resposta :stuck_out_tongue:

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?