Eliminar todos los archivos en el directorio (pero no en el directorio): solución de una sola línea

Resuelto Fahim Parkar asked hace 12 años • 13 respuestas

Quiero eliminar todos los archivos dentro del directorio ABC.

Cuando lo intenté, FileUtils.deleteDirectory(new File("C:/test/ABC/"));también elimina la carpeta ABC.

¿Existe una solución única en la que pueda eliminar archivos dentro del directorio pero no en el directorio?

Fahim Parkar avatar Nov 02 '12 20:11 Fahim Parkar
Aceptado
import org.apache.commons.io.FileUtils;

FileUtils.cleanDirectory(directory); 

Hay este método disponible en el mismo archivo. Esto también eliminará de forma recursiva todas las subcarpetas y archivos que se encuentran debajo de ellas.

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

Reddy avatar Nov 02 '2012 13:11 Reddy

¿Quieres decir como?

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

Esto sólo eliminará archivos, no directorios.

Peter Lawrey avatar Nov 02 '2012 13:11 Peter Lawrey

La respuesta de Peter Lawrey es excelente porque es simple y no depende de nada especial, y es la forma en que debes hacerlo. Si necesita algo que elimine también los subdirectorios y sus contenidos, utilice la recursividad:

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

Para ahorrar subdirectorios y su contenido (parte de su pregunta), modifíquelo de la siguiente manera:

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

O, ya que quería una solución de una sola línea:

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

Usar una biblioteca externa para una tarea tan trivial no es una buena idea a menos que necesites esta biblioteca para otra cosa, en cuyo caso es preferible usar código existente. Parece que estás usando la biblioteca Apache de todos modos, así que usa su FileUtils.cleanDirectory()método.

Chrissi avatar Nov 18 '2013 08:11 Chrissi

Corriente Java 8

Esto elimina sólo archivos de ABC (los subdirectorios no se modifican):

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

Esto elimina sólo archivos de ABC (y subdirectorios):

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

^ Esta versión requiere manejar IOException

NonlinearFruit avatar Nov 21 '2016 19:11 NonlinearFruit