Eliminar todos los archivos en el directorio (pero no en el directorio): solución de una sola línea
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?
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
¿Quieres decir como?
for(File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
Esto sólo eliminará archivos, no directorios.
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.
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