Como saber porque uma exclusão de arquivo falha em Java?

File file = new File(path); if (!file.delete()) { throw new IOException( "Failed to delete the file because: " + getReasonForFileDeletionFailureInPlainEnglish(file)); } 

Existe uma boa implementação de getReasonForFileDeletionFailureInPlainEnglish(file) já disponível? Ou então eu vou ter que escrever sozinho.

No Java 6, infelizmente não há como determinar por que um arquivo não pode ser excluído. Com o Java 7, você pode usar java.nio.file.Path#delete() , que lhe dará uma causa detalhada da falha, se o arquivo ou diretório não puder ser excluído.

Observe que file.list () pode retornar inputs para diretórios, que podem ser excluídos. A documentação da API para exclusão diz que apenas diretórios vazios podem ser excluídos, mas um diretório é considerado vazio, se os arquivos contidos forem, por exemplo, arquivos de metadados específicos do sistema operacional.

Hmm, o melhor que eu pude fazer:

 public String getReasonForFileDeletionFailureInPlainEnglish(File file) { try { if (!file.exists()) return "It doesn't exist in the first place."; else if (file.isDirectory() && file.list().length > 0) return "It's a directory and it's not empty."; else return "Somebody else has it open, we don't have write permissions, or somebody stole my disk."; } catch (SecurityException e) { return "We're sandboxed and don't have filesystem access."; } } 

Esteja ciente de que pode ser seu próprio aplicativo que impede que um arquivo seja excluído!

Se você escreveu para o arquivo anteriormente e não fechou o gravador, você está bloqueando o arquivo.

Uma exclusão pode falhar devido a um ou mais motivos:

  1. Arquivo não existe (use o File#exists() para testar).
  2. O arquivo está bloqueado (porque é aberto por outro aplicativo (ou seu próprio código!).
  3. Você não está autorizado (mas isso teria lançado um SecurityException, não retornado falso!).

Portanto, sempre que a exclusão falhar, File#exists() um File#exists() para verificar se é causado por 1) ou 2).

Resumido:

 if (!file.delete()) { String message = file.exists() ? "is in use by another app" : "does not exist"; throw new IOException("Cannot delete file, because file " + message + "."); } 

A class Java 7 java.nio.file.Files também pode ser usada:

http://docs.oracle.com/javase/tutorial/essential/io/delete.html

 try { Files.delete(path); } catch (NoSuchFileException x) { System.err.format("%s: no such" + " file or directory%n", path); } catch (DirectoryNotEmptyException x) { System.err.format("%s not empty%n", path); } catch (IOException x) { // File permission problems are caught here. System.err.println(x); } 

Como apontado em File.delete ()

você pode usar um SecurityManager que lança o exeception para você.