File file = new File(path);
if (!file.delete())
{
throw new IOException(
"Failed to delete the file because: " +
getReasonForFileDeletionFailureInPlainEnglish(file));
}
Existe-t-il déjà une bonne implémentation de getReasonForFileDeletionFailureInPlainEnglish(file)
? Sinon, je devrai l'écrire moi-même.
Dans Java 6, il n'y a malheureusement aucun moyen de déterminer pourquoi un fichier ne peut pas être supprimé. Avec Java 7, vous pouvez utiliser Java.nio.file.Path#delete()
à la place, ce qui vous donnera une cause détaillée de l'échec, si le fichier ou le répertoire ne peut pas être supprimé.
Notez que file.list () peut retourner des entrées pour les répertoires, qui peuvent être supprimées. La documentation de l'API pour la suppression indique que seuls les répertoires vides peuvent être supprimés, mais un répertoire est considéré comme vide, si les fichiers contenus sont par exemple Fichiers de métadonnées spécifiques au système d'exploitation.
Hmm, je pourrais mieux faire:
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.";
}
}
Sachez que cela peut être votre propre application qui empêche la suppression d'un fichier!
Si vous avez écrit dans le fichier précédemment et que vous n'avez pas fermé le rédacteur, vous verrouillez le fichier vous-même.
La classe Java 7 Java.nio.file.Files peut également être utilisée:
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);
}
Une suppression peut échouer pour une ou plusieurs raisons:
File#exists()
pour tester).Donc, chaque fois que la suppression échoue, faites une File#exists()
pour vérifier si elle est causée par 1) ou 2).
Résumé:
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 + ".");
}