GOOGLE ADS

miércoles, 4 de mayo de 2022

Eliminar archivos y carpetas dentro de la carpeta si está vacía (Java)

 String dirWay = "C:\\Project";
int daysBack = 7;
File directory = new File(dirWay);
if(directory.exists()){
File[] listFiles = directory.listFiles();
long purgeTime = System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);
for(File listFile: listFiles) {
if(listFile.lastModified() < purgeTime) {
if(!listFile.delete()) {
System.err.println("Unable to delete file: " + listFile);

} else {
System.out.println(listFile);
}
}
}
}

Esto funciona solo para archivos de carpetas de proyectos. Pero tengo algunas carpetas y archivos en la carpeta Proyecto, y cada carpeta tiene algunas carpetas y archivos.

¿Cómo puedo verificar dentro de todas las carpetas y verificar la última fecha de modificación de los archivos y eliminarlos si tienen más de 7 días?

Por ejemplo, tengo el directorio: C:/Proyecto/JavaIdea/... Si los archivos en la carpeta JavaIdea tienen más de 7 días, necesito eliminar todos los archivos y la carpeta JavaIdea también.


Solución del problema

La forma más fácil es probablemente usar Files.walkFileTree. Files.walkte da un Stream<Path>, pero las carpetas van primero, no después. Por FileVisitorotro lado, usa dos eventos para carpetas: antes de visitar y después.

Algo que podría funcionar (no probado):

Deque<LongAdder> counts = new ArrayDeque<>(); // counting # of remaining files per level
Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) {
counts.push(new LongAdder());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(T dir, BasicFileAttributes attrs) throws IOException {
long remaining = counts.pop().sum();
if (remaining == 0) {
// the directory is empty now, delete it
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException {
if (is old enough to delete) {
// delete
} else {
counts.peek().increment();
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(T file, IOException exc) {
counts.peek().increment();
return FileVisitResult.CONTINUE;
}
});

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...