252 votes

Supprimer tous les fichiers du répertoire (mais pas le répertoire) - solution unique

Je veux supprimer tous les fichiers du répertoire ABC.

Quand j'ai essayé avec FileUtils.deleteDirectory(new File("C:/test/ABC/")); il supprime également le dossier ABC.

Existe-t-il une solution unique permettant de supprimer les fichiers à l'intérieur du répertoire mais pas le répertoire ?

2 votes

C'est parce que .deleteDirectory (même le nom l'indique) est utilisé pour supprimer les répertoires. Il récupère le répertoire dans lequel il se trouve si le fichier n'est pas un répertoire.

0 votes

Essayez de trouver d'autres fonctions dans la classe FileUtils, qui suppriment les fichiers au lieu des répertoires.

1 votes

427voto

Reddy Points 2446
import org.apache.commons.io.FileUtils;

FileUtils.cleanDirectory(directory); 

Cette méthode est disponible dans le même fichier. Cette méthode supprime également de manière récursive tous les sous-dossiers et les fichiers qu'ils contiennent.

Docs : org.apache.commons.io.FileUtils.cleanDirectory

56 votes

Bien joué, également pour éviter que les gens n'aient à chercher ; voici l'import : import org.apache.commons.io.FileUtils ;

5 votes

Je dois encore chercher pourquoi l'importation ne peut être trouvée. C'est parce qu'il faut Téléchargez-le sur apache.org .

0 votes

Jolie solution. Vérifiez cette librairie par gradle : compilez "commons-io:commons-io:+"

302voto

Peter Lawrey Points 229686

Tu veux dire comme ?

for(File file: dir.listFiles()) 
    if (!file.isDirectory()) 
        file.delete();

Cela ne supprimera que les fichiers, pas les répertoires.

77 votes

C'est définitivement la meilleure réponse, puisqu'elle n'utilise pas de librairie externe !

0 votes

@AlexWien Mais le PO utilise déjà cette bibliothèque. Vous avez dû le remarquer.

12 votes

Mais même dans ce cas, lorsqu'il existe une méthode standard, il n'y a absolument aucune raison d'utiliser une méthode externe qui fait la même chose. Un jour, il pourrait vouloir se débarrasser de la librairie, ou la librairie n'est plus supportée, ou il n'est pas autorisé à utiliser la librairie pour des raisons de licence, etc. (Tout cela peut ne pas être un problème pour cette librairie spécifique, mais s'applique à de nombreuses autres).

69voto

ChrisB Points 221

La réponse de Peter Lawrey est excellente car elle est simple et ne dépend pas de quelque chose de spécial, et c'est la façon dont vous devriez procéder. Si vous avez besoin de quelque chose qui supprime également les sous-répertoires et leur contenu, utilisez la récursion :

void purgeDirectory(File dir) {
    for (File file: dir.listFiles()) {
        if (file.isDirectory())
            purgeDirectory(file);
        file.delete();
    }
}

Pour épargner les sous-répertoires et leur contenu (partie de votre question), modifiez comme suit :

void purgeDirectoryButKeepSubDirectories(File dir) {
    for (File file: dir.listFiles()) {
        if (!file.isDirectory())
            file.delete();
    }
}

Ou, puisque vous vouliez une solution en une ligne :

for (File file: dir.listFiles())
    if (!file.isDirectory())
        file.delete();

L'utilisation d'une bibliothèque externe pour une tâche aussi triviale n'est pas une bonne idée, sauf si vous avez de toute façon besoin de cette bibliothèque pour autre chose, auquel cas il est préférable d'utiliser le code existant. Vous semblez utiliser la bibliothèque Apache de toute façon, alors utilisez sa fonction FileUtils.cleanDirectory() méthode.

1 votes

D'un autre côté, si personne n'est le premier à utiliser la bibliothèque externe, il est moins probable que d'autres s'attendent à trouver un comportement similaire dans cette bibliothèque externe, et moins probable qu'ils y cherchent... n'avons-nous pas assez de "Not Invented Here" là-dehors ? Si la bibliothèque est cohérente et facile à ajouter à mon projet, je préfère presque toujours l'ajouter.

13voto

Ou pour l'utiliser en Java 8 :

try {
  Files.newDirectoryStream( directory ).forEach( file -> {
    try { Files.delete( file ); }
    catch ( IOException e ) { throw new UncheckedIOException(e); }
  } );
}
catch ( IOException e ) {
  e.printStackTrace();
}

C'est dommage que la gestion des exceptions soit si volumineuse, sinon il suffirait d'une seule ligne...

0 votes

Comment savez-vous que ce fichier IS un fichier en fait et non un répertoire ?

1 votes

Il supprime également le répertoire, donc ce n'est pas une solution au problème du sujet.

6voto

public class DeleteFile {
    public static void main(String[] args) {
        String path="D:\test"; 
        File file = new File(path);
        File[] files = file.listFiles(); 
        for (File f:files) 
        {if (f.isFile() && f.exists) 
            { f.delete();
system.out.println("successfully deleted");
            }else{
system.out.println("cant delete a file due to open or error");
} }  }}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X