web-dev-qa-db-fra.com

Java 'file.delete ()' ne supprime pas le fichier spécifié

C'est actuellement ce que je dois supprimer le fichier mais cela ne fonctionne pas. Je pensais que ça pouvait être des problèmes de permission ou quelque chose comme ça mais ce n'était pas le cas. Le fichier que je teste est vide et existe, donc je ne sais pas pourquoi il ne le supprime pas.

UserInput.Prompt("Enter name of file to delete");
String name = UserInput.readString();
File file = new File("\\Files\\" + name + ".txt");
file.delete();

Toute aide serait grandement appréciée!

J'ai maintenant:

File file = new File(catName + ".txt");
String path = file.getCanonicalPath();
File filePath = new File(path);
filePath.delete();

Pour essayer de trouver le chemin d'accès correct au moment de l'exécution afin que si le programme est transféré vers un autre ordinateur, il trouve toujours le fichier.

38
Kimberley Lloyd

Assurez-vous de trouver votre répertoire de travail actuel et d'écrire votre chemin de fichier par rapport à celui-ci.

Ce code:

File here = new File(".");
System.out.println(here.getAbsolutePath());

... imprimera ce répertoire.

De plus, sans rapport avec votre question, essayez d'utiliser File.separator pour rester indépendant du système d'exploitation. Les barres obliques inverses ne fonctionnent que sur Windows.

32
Goran Jovic

Le problème peut également être dû à des flux de sortie que vous avez oublié de fermer. Dans mon cas, je travaillais avec le fichier avant que le fichier ne soit supprimé. Cependant, à un endroit des opérations sur les fichiers, j'avais oublié de fermer un flux de sortie que j'avais l'habitude d'écrire dans le fichier qui avait été tenté de supprimer plus tard.

56
user2926391

J'ai le même problème! s'est alors rendu compte que mon répertoire n'était pas vide. J'ai trouvé la solution dans un autre thread: impossible de supprimer le répertoire via Java

/**
 * Force deletion of directory
 * @param path
 * @return
 */
static public boolean deleteDirectory(File path) {
    if (path.exists()) {
        File[] files = path.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                deleteDirectory(files[i]);
            } else {
                files[i].delete();
            }
        }
    }
    return (path.delete());
}
11
Maha

Je soupçonne que le problème est que le chemin est incorrect. Essaye ça:

UserInput.Prompt("Enter name of file to delete");
String name = UserInput.readString();
File file = new File("\\Files\\" + name + ".txt");
if (file.exists()) {
    file.delete();
} else {
    System.err.println(
        "I cannot find '" + file + "' ('" + file.getAbsolutePath() + "')");
}
6
Stephen C

Si vous souhaitez supprimer le fichier, fermez d'abord toutes les connexions et les flux. après cela, supprimez le fichier.

5
Anurag Mishra

Essayez de fermer tous les FileOutputStream/FileInputStream vous avez ouvert plus tôt dans d'autres méthodes, puis essayez de supprimer, travaillé comme un charme.

3
ABHISHEK BHARDWAJ

Dans mon cas, c'est le close () qui ne s'exécutait pas en raison d'une exception non gérée.

void method() throws Exception {
    FileInputStream fis = new FileInputStream(fileName);
    parse(fis);
    fis.close();
}

Supposons qu'une exception est levée sur le parse (), qui n'est pas géré dans cette méthode et que le fichier n'est donc pas fermé, en cours de route, le fichier est supprimé et cette instruction de suppression échoue et ne supprime pas.

Donc, à la place, j'avais le code comme ça, alors ça a fonctionné ...

    try {
        parse(fis);
    }
    catch (Exception ex) {
        fis.close();
        throw ex;
    }

java si basique, que nous oublions parfois.

1
Abdul Ahad

Comme d'autres réponses l'indiquent, sous Windows, vous ne pouvez pas supprimer un fichier ouvert. Cependant, une autre chose qui peut empêcher la suppression d'un fichier sous Windows est s'il est mmapé à un MappedByteBuffer (ou DirectByteBuffer) - si tel est le cas, le fichier ne peut pas être supprimé avant le tampon d'octets est récupéré. Il existe un code relativement sûr pour fermer (nettoyer) de force un DirectByteBuffer avant qu'il ne soit récupéré ici: https://github.com/classgraph/classgraph/blob/master/src/main/ Java/nonapi/io/github/classgraph/utils/FileUtils.Java # L606 Après avoir nettoyé le ByteBuffer, vous pouvez supprimer le fichier. Cependant, assurez-vous de ne plus jamais utiliser le ByteBuffer après l'avoir nettoyé, sinon la JVM plantera.

0
Luke Hutchison