Tem como recuperar arquivo deletado pelo java.io.File.delete();?

Olá pessoal!

Talvez isso seja até uma pergunta para o “Java Básico” mas como trata-se de manipulação de arquivos vamos lá:

o metódo java.io.File.delete(); deleta o arquivo definitivamente do disco?

Abs

Sim. Delete chama a função de exclusão do sistema operacional. E aí, adeus.

Você até pode tentar recorrer a programas de undelete, como esses aqui:

Eu já usei o Recuva e é muito bom.

Só complementando:
Esse método solicita ao sistema operacional (Windows, Linux, Solaris etc.) que o arquivo seja removido (“unlink”) do disco. Como isso é interpretado pelo sistema operacional depende, obviamente, do sistema operacional.

No caso do Linux, Solaris e outros Unix, o “unlink” remove o arquivo do diretório solicitado; isso não quer dizer que o arquivo “em si” desapareça porque ele pode estar sendo referenciado por um outro “link” (no Unix é possível usar o recurso de “hard link” em que um mesmo arquivo está sendo referenciado com vários nomes diferentes (e até mesmo em vários diretórios diferentes).

Outra sutileza é que é possível remover um arquivo que está ainda aberto e em uso - ele não aparece mais na entrada do diretório, mas você pode até ler e gravar dele se você ainda tiver um “descriptor” para ele. O arquivo continua ocupando espaço. Quando todos os programas que estavam usando esse arquivo fecharem o arquivo, então ele vai realmente sumir.

No caso do Windows, o “delete” está submetido às regras do Windows (ou seja, não é possível deletar ou renomear um arquivo em uso), e normalmente o “delete” falha porque o arquivo ainda está em uso por algum motivo. Um problema sério é que nem sempre ele reporta corretamente ao programa que está efetuando a chamada à API “DeleteFile” por que é que não deletou o arquivo; e muitas vezes o “delete” do Java acaba reportando que o arquivo foi deletado com sucesso, quando na verdade não foi. No Windows é recomendável, depois de um “delete”, checar se o arquivo ainda existe…

Senhores, obrigado pelas respostas.

Estou na manutenção de um sistema de troca de dados (EDI) e o mesmo criptografa determinados arquivos com dados sensíveis, excluindo os originais após esse processo. Preciso garantir que essa exclusão seja em definitivo. Garantir isso inclusive é uma ação dentre várias para se obter a certificação do PCI Security Standards Council pela empresa.

Existe alguma forma de excluir arquivos definitivamente, mesmo utilizando esses programas de undelete?

O que normalmente se faz é o seguinte: usar um programa externo (normalmente escrito em C) que deve ser chamado ANTES de você apagar o arquivo, para que esse programa DELETE SEGURAMENTE o arquivo para você.

A idéia é que ele apague o arquivo para você, mas antes ele costuma fazer o seguinte: se o sistema de arquivos sendo usado é em disco e o diretório está configurado para não apagar os arquivos, esse programa sobreescreve o arquivo com um padrão de zeros e uns binários de forma que seja bastante difícil recuperar o arquivo se você não tiver ferramentas especiais.

Um exemplo de um programa desses é o sdelete:

No caso do Linux, você pode tentar usar alguma das ferramentas disponíveis no pacote secure-delete (se for o Ubuntu) ou coisa parecida na sua distribuição de preferência:

http://techthrob.com/2009/03/02/howto-delete-files-permanently-and-securely-in-linux/

Obrigado pessoal.

Valeu pelos esclarecimentos.