1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problema ao renomear arquivo após a segunda execução

Tenho uma aplicação que segue as seguintes etapas:

1 - roda um método em um determinado momento (através do Scheduler no Quartz)

2 - conecta no ftp , se há arquivos disponíveis (são arquivos txt), ele copia todos arquivos e coloca uma outra extensão .np em cada arquivo (ficando por exemplo arquivo1.txt.np).

3 - depois de copiado, ele acessa o diretório e procura todos com a extensão .np, para cada arquivo é gerado uma String do conteúdo e depois é gravado numa tabela no banco de dados.

4 - finalizando o processo, devo remover a extensão .np (assim indico que esse arquivo já foi persistido no banco).

Um detalhe é que se o arquivo já existe no diretório, então devo renomea-lo com um _1 , se já existe com _1 então _2 e assim por diante.

Bom, minha aplicação funciona corretamente apenas no primeiro scheduler, porém a partir da segunda vez que o scheduler é executado, a aplicação não consegue renomear o arquivo .np , parece que o arquivo fica em uso e o sistema impede a alteração do arquivo.

Não estou conseguindo identificar onde o arquivo fica "travado" no sistema.

Segue o método :

public void registraArquivosRecebidos(ClienteFtp clienteFtp) {
       File baseFolder = new File(diretorioRaiz + clienteFtp.getNome() + dirRecebidos); // diretorio principal      
       File[] files = baseFolder.listFiles();

            for (File arqNp : files) {
                if (arqNp.getPath().endsWith(".np")) {  // pego todos arquivos com a extensão .np
                    String novoNome = arqNp.getAbsolutePath().replace(".np", "");
                    File arquivo = new File(novoNome);
                    if (arquivo.exists()) {
                        System.out.println("Arquivo ja existe.... ");
                        String auxiliar;
                        int count = 0;
                        while (arquivo.exists()) {
                            auxiliar = novoNome;
                            count += 1;
                            auxiliar = auxiliar.substring(0, novoNome.lastIndexOf('.'));
                            auxiliar = (auxiliar + "_" + count);
                            auxiliar += ".txt";
                            arquivo = new File(auxiliar);
                        }
                    }
                    System.out.println("novoNome FINAL = " + arquivo);
                    FileUtils.copyFile(arqNp, arquivo);
                    FileUtils.forceDelete(arqNp);
                }
            }

Como eu disse, na primeira vez tudo acontece corretamente, porém a partir da segunda execução ocorre o erro: java.io.IOException: Unable to delete file: C:\jboss-as-7.1.1.Final\bin\Aplicacao\Recebidos\arquivo20150415095552.txt.np

Já tentei usar o método renameTo mas também ocorre o mesmo problema.

Creio não ser caso de permissão de diretório, pois na primeira execução tudo dá certo.

Qualquer sugestão é bem vinda, já tentei diversas maneiras sem sucesso.

Obrigado!

  • Essa classe FileUtils é sua? Se for, pode postar os métodos copyFile e forceDelete?

    ViniGodoy   01 de mai de 2015
  • Opa VinviGodoy! Não, a classe FileUtils é do Apache commons (http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html), tentei com a File.renameTo e também não deu certo. Se eu tento deletar manualmente o arquivo (indo na pasta pelo explorer) também não consigo, preciso fechar o processo do java para poder deletar o arquivo na mão.

    Heitor   02 de mai de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java io ejb ou faça a sua própria pergunta.