Problema apagar arquivo

Boa tarde…

Estou com o seguinte problema.

Quando eu lanço uma exceção dentro do meu for, depois eu não estou conseguindo apagar o arquivo pois fala que ele está em uso pelo processo do java…

List<File> fileApagar = new ArrayList<File>();
for (File file: files)
{
	try
		{
			if(operacao == null){
				throw new Exception("Operação Invalida");
			}
		}catch(Throwable th)
        {	
			fileApagar.add(file);
			///grava os logs no banco do erro
		}
}
for (File file : fileApagar) {
    if (file != null && file.exists()){
        file.delete(); //aqui da o erro na hora de apagar
    }
}

Alguém saberia como me ajudar???

Oi Magni, boa tarde !

Poderia postar o erro do console ?

[quote=mozena]Oi Magni, boa tarde !

Poderia postar o erro do console ?

[/quote]

Esqueci de falar na mensagem, não da erro nenhum no console, simplesmente não apaga o arquivo…

E se eu tento ir manualmente e excluir o arquivo fala que ele está em uso pelo Java…

Eu fiz um outro teste e coloquei na hora do delete o código

boolean exclui = file.delete();
System.out.println(exclui); //aqui ele imprime true,,, só que o arquivo não apaga

Entendi. O problema não está em seu codigo.

Você está testando este codigo em sua maquina local ?

Se sim, verifique se todas as threads do java estejam paradas. Tambem pode utilizar o task manager.

Provavelmente tenha algum processo de run\debug rodando.

Feche todos e teste novamente.

for (File file: files)  
{  
    try  
        {  
            if(operacao == null){  
                throw new Exception("Operação Invalida");  
            }  
        }catch(Throwable th)  
        {     
            // ao inves de jogar o arquivo para outra lista e depois dar um loop nela, porque nao apagar imediatamente o arquvo do disco ?
            file.delete(); 
        }  
}  

o que acha ?

Ja respondendo a pergunta do mozena e do CristianPalmaSola10…

Seguinte a lógica do CristianPalmaSola10 de colocar o delete dentro do catch eu tentei, mas não apaga do mesmo jeito…

Sobre ta executando em máquina local eu estou, só que o problema é que a aplicação é em JavaEE e esse código está dentro de um timer que o glasfish dispara de 1 em uma hora…
Ai eu não posso matar o processo do java…

Se tiverem alguma outra idéia, será de grande ajuda

Usualmente você faz algo como:

File f = ...;
FileOutputStream fos = null;
try {
    try {
        /* O código que abre o arquivo fos e que eventualmente pode dar problemas */
    } finally {
        // Mesmo que ocorrer algum problema, vamos fechar o arquivo na marra
        if (fos != null) try { fos.close(); } 
    }
} catch (Throwable thr) {
    f.delete(); // tratamento de apagamento de arquivos - aqui o arquivo deve ter sido fechado no finally
}

Ahh o aplicativo está em produção… :?

Testei local e funcionou corretamente. A task qye você configurou demora quanto tempo para finalizar? Será que não está executando uma em cima da outra ?

Outro ponto de atenção: No final do processo o glasfish está matando as threads ? tem como você conferir ?

Concordo com nosso amigo Entanglement, você deve fechar os arquivos antes de deletar.

Linha 2: o objeto files possui elementos? Se não possuir, seu objeto fileApagar estará vazio.

Linha 6: o que é o objeto “operacao”? Se este valor for diferente de null ou não lançar exceção, não entra no catch e seu fileApagar estará vazio.

Dica: execute esse código em modo debug ou coloque instruções System.out.println (temporariamente) nos trechos do seu código.

Esses dias eu passei por algo semelhante, eu criava um arquivo no servidor para gravar uns dados e depois tentava apaga-lo e ele não era apagado, depois de muito bater cabeça percebi que o arquivo naum era apagado por eu naum dar um close nele antes, talvez seja isso agora tambem