web-dev-qa-db-fra.com

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

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

Lorsque 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 des fichiers dans un répertoire mais pas dans un répertoire?

181
Fahim Parkar
_FileUtils.cleanDirectory(directory); 
_

Il y a cette méthode disponible dans le même fichier. Cela supprimera également de manière récursive tous les sous-dossiers et fichiers qu'ils contiennent.

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

315
Reddy

Tu veux dire comme?

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

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

250
Peter Lawrey

La réponse de Peter Lawrey est excellente parce que c'est simple et ne dépend de rien de spécial, et c'est la façon dont vous devriez le faire. Si vous avez besoin de quelque chose qui supprime également les sous-répertoires et leur contenu, utilisez la récursivité:

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 sur 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 besoin de cette bibliothèque pour autre chose de toute façon, auquel cas il est préférable d'utiliser le code existant. De toute façon, vous semblez utiliser la bibliothèque Apache, utilisez donc sa méthode FileUtils.cleanDirectory().

60
ChrisB

Java 8 Stream

Ceci ne supprime que les fichiers de ABC (les sous-répertoires ne sont pas modifiés):

Arrays.stream(new File("C:/test/ABC/").listFiles()).forEach(File::delete);

Ceci ne supprime que les fichiers de ABC (et sous-répertoires):

Files.walk(Paths.get("C:/test/ABC/"))
                .filter(Files::isRegularFile)
                .map(Path::toFile)
                .forEach(File::delete);

^ Cette version nécessite la gestion de l'IOException

29
NonlinearFruit

Ou utiliser ceci dans Java 8:

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

Dommage que le traitement des exceptions soit si volumineux, sinon ce serait un one-liner ...

11
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");
} }  }}
5
Manbumihu Manavan

Une autre solution Java 8 Diffusez en continu pour supprimer tout le contenu d'un dossier, sous-répertoires inclus, mais pas le dossier lui-même.

Usage:

Path folder = Paths.get("/tmp/folder");
CleanFolder.clean(folder);

et le code:

public interface CleanFolder {
    static void clean(Path folder) throws IOException {

        Function<Path, Stream<Path>> walk = p -> {
            try { return Files.walk(p);
        } catch (IOException e) {
            return Stream.empty();
        }};

        Consumer<Path> delete = p -> {
            try {
                Files.delete(p);
            } catch (IOException e) {
            }
        };

        Files.list(folder)
            .flatMap(walk)
            .sorted(Comparator.reverseOrder())
            .forEach(delete);
    }
}

Le problème avec chaque solution de flux impliquant Files.walk ou Files.delete est que ces méthodes génèrent des exceptions IOException difficiles à gérer dans les flux.

J'ai essayé de créer une solution aussi concise que possible.

2
hijack

Pour supprimer tous les fichiers du répertoire, dites "C:\Example"

File file = new File("C:\\Example");      
String[] myFiles;    
if (file.isDirectory()) {
    myFiles = file.list();
    for (int i = 0; i < myFiles.length; i++) {
        File myFile = new File(file, myFiles[i]); 
        myFile.delete();
    }
}
2
Mahesh Narwade
package com;
import Java.io.File;
public class Delete {
    public static void main(String[] args) {

        String files; 
        File file = new File("D:\\del\\yc\\gh");
        File[] listOfFiles = file.listFiles(); 
        for (int i = 0; i < listOfFiles.length; i++) 
        {
            if (listOfFiles[i].isFile()) 
            {
                files = listOfFiles[i].getName();
                System.out.println(files);
                if(!files.equalsIgnoreCase("Scan.pdf"))
                {
                    boolean issuccess=new File(listOfFiles[i].toString()).delete();
                    System.err.println("Deletion Success "+issuccess);
                }
            }
        }
    }
}

Si vous voulez supprimer tous les fichiers, supprimez

if(!files.equalsIgnoreCase("Scan.pdf"))

déclaration cela fonctionnera.

1
Mahesh

Je pense que cela fonctionnera (basé sur la réponse précédente de NonlinearFruit):

Files.walk(Paths.get("C:/test/ABC/"))
                .sorted(Comparator.reverseOrder())
                .map(Path::toFile)
                .filter(item -> !item.getPath().equals("C:/test/ABC/"))
                .forEach(File::delete);

À votre santé!

0
dansouza