web-dev-qa-db-fra.com

Comment savoir pourquoi une suppression de fichier échoue en Java?

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.

39
Arne Evertsson

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.

24
jarnbjo

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.";
    }
}
21
Cory Petosky

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.

10
xastor

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);
}
9
Quark

Une suppression peut échouer pour une ou plusieurs raisons:

  1. Le fichier n'existe pas (utilisez File#exists() pour tester).
  2. Le fichier est verrouillé (car il est ouvert par une autre application (ou votre propre code!).
  3. Vous n'êtes pas autorisé (mais cela aurait levé une SecurityException, pas retourné faux!).

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 + ".");
}
4
BalusC