[RESOLVIDO] Deletar Arquivos

Estou fazendo um processo de Upload onde jogo os meus arquivos para dentro de uma pasta do meu servidor, quanto a isso tudo ok, o que preciso agora depois de serem upados e gravados em banco que eu consiga deletar esses arquivos, como preciso deles em BD nao tenho pq manter copia em pasta para ocupar espaço.

hoje crio um Array que coloco todos os meus itens adicionados pelo upload.

caminhos = new ArrayList<String>();
caminhos.add(caminho);

Até ai perfeito, fica com uma lista de todos os arquivos gravados na pasta do servidor, cada item contem o caminho completo

e depois no final da minha rotina depois da gravaçao, eu deleto eles:

if (!caminhos.isEmpty()) { //Deleta o arquivo 
                    for (int i = 0; caminhos.size() > i; i++) {
                        Path rootPath = Paths.get(caminhos.get(i));
                        Files.delete(rootPath);
                    }
                    caminhos.clear();
                }

O meu problema está sendo que o arquivo fica preso em memoria de uso, precisaria que fosse liberado para que fosse deletado, senao acaba emitindo o seguinte “erro”:

Alguem sabe como posso fazer para liberar esses arquivos de memoria?

Obrigado

Bom Dia

[quote]PrimeFaces uses Apache Commons FileUpload under the covers for this. It will create the file as a temporary file and hence the file will already be automatically deleted if there are no open File nor InputStream references to it when the Java Garbage Collector runs.

So if you can make absolutely sure that you close the InputStream after processing (in the finally block!), then you don’t need to worry about cleanup.[/quote]

Referencia:http://stackoverflow.com/questions/12024348/how-to-delete-primefaces-uploadedfile-temp-file-after-processing

Utilizando a sua idéia só pediria pra dar um close no file antes de mandar remover.Pesquisar por lock para files “trylock”

Salve…

Veja se este tópico não lhe ajuda…

http://www.guj.com.br/java/279796-resolvido-upload-em-banco-de-dados-com-primefaces

Acredito ser mais pratico fazer desse modo, do que salvar temporariamente e depois excluir os arquivos necessários.

Solução:

 public boolean incluirArquivo(File f) throws FileNotFoundException {
        try {
            //converte o objeto file em array de bytes
            InputStream is = new FileInputStream(f.getPath());
            upLoadChamado.setBytes(new byte[(int) f.length()]);
            int offset = 0;
            int numRead = 0;
            while (offset < upLoadChamado.getBytes().length
                    && (numRead = is.read(upLoadChamado.getBytes(), offset, upLoadChamado.getBytes().length - offset)) >= 0) {
                offset += numRead;
            }
            bytes_novo = upLoadChamado.getBytes();
            is.close();
            f.delete(); //Deleta o arquivo onde foi criado
            return true;
        } catch (IOException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Erro ao Converter Anexo", ex.getMessage()));
        }
        return false;
    }

Fechar e deletar antes de qualquer outra ação, assim jogo para a minha variavel upLoadChamado.setBytes(new byte[(int) f.length()]); onde já vai atribuir o arquivo em uso e logo em seguida fecho e deleto.

Valeu a todos!