java - por - Eliminar todos los archivos en el directorio(pero no en el directorio): una solución de línea
metodo delete java (9)
Quiero eliminar todos los archivos dentro del directorio ABC.
Cuando probé con FileUtils.deleteDirectory(new File("C:/test/ABC/"));
también elimina la carpeta ABC.
¿Hay una solución de un trazador de líneas donde puedo eliminar archivos dentro del directorio pero no del directorio?
Java 8 Stream
Esto elimina solo los archivos de ABC (los subdirectorios no se modifican):
Arrays.stream(new File("C:/test/ABC/").listFiles()).forEach(File::delete);
Esto elimina solo los 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 el manejo de la excepción IOException
¿Quieres decir como?
for(File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
Esto solo eliminará archivos, no directorios.
La respuesta de Peter Lawrey es genial porque es simple y no depende de nada especial, y es la forma en que debes hacerlo. Si necesita algo que también elimine subdirectorios y sus contenidos, use la recursión:
void purgeDirectory(File dir) {
for (File file: dir.listFiles()) {
if (file.isDirectory()) purgeDirectory(file);
file.delete();
}
}
Para reservar subdirectorios y sus contenidos (parte de su pregunta), modifique de la siguiente manera:
void purgeDirectoryButKeepSubDirectories(File dir) {
for (File file: dir.listFiles()) {
if (!file.isDirectory()) file.delete();
}
}
O bien, 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 necesite esta biblioteca para otra cosa, en cuyo caso es preferible usar el código existente. Parece que está utilizando la biblioteca de Apache de todos modos, así que use su método FileUtils.cleanDirectory()
.
O para usar esto 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();
}
Es una lástima que el manejo de excepciones sea tan voluminoso, de lo contrario sería un trazador de líneas ...
Otra solución Java 8 Stream para eliminar todo el contenido de una carpeta, subdirectorios incluidos, pero no la carpeta en sí.
Uso:
Path folder = Paths.get("/tmp/folder");
CleanFolder.clean(folder);
y el código:
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);
}
}
El problema con cada solución de flujo que implica Files.walk o Files.delete es que estos métodos arrojan IOException, que son difíciles de manejar en las transmisiones.
Traté de crear una solución que sea lo más concisa posible.
Para eliminar todos los archivos del directorio, diga "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();
}
}
FileUtils.cleanDirectory(directory);
Hay este método disponible en el mismo archivo. Esto también eliminará de forma recursiva todas las subcarpetas y archivos debajo de ellos.
Documentos: org.apache.commons.io.FileUtils.cleanDirectory
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 desea eliminar todos los archivos, elimine
if(!files.equalsIgnoreCase("Scan.pdf"))
declaración que funcionará.
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");
} } }}