Mantén la atención ya que en esta noticia hallarás el resultado que buscas.
Solución:
La API solo admite la eliminación de un solo objeto a la vez. Solo puede solicitar muchas eliminaciones utilizando muchas solicitudes HTTP o agrupando muchas solicitudes de eliminación. No hay una llamada a la API para eliminar varios objetos mediante comodines o similares. Para borrar todos los objetos con un determinado prefixnecesitaría enumerar los objetos y luego hacer una llamada de eliminación para cada objeto que coincida con el patrón.
La utilidad de línea de comandos, gsutil, hace exactamente eso cuando le pide que elimine la ruta “gs://bucket/dir/**. Obtiene una lista de objetos que coinciden con ese patrón, luego realiza una llamada de eliminación para cada uno de ellos. a ellos.
Si necesita una solución rápida, siempre puede tener su programa Java exec gsutil.
Aquí está el código que corresponde a la respuesta anterior en caso de que alguien más quiera usarlo:
public void deleteFolder(String bucket, String folderName) throws CoultNotDeleteFile
try
ListResult list = gcsService.list(bucket, new ListOptions.Builder().setPrefix(folderName).setRecursive(true).build());
while(list.hasNext())
ListItem item = list.next();
gcsService.delete(new GcsFilename(file.getBucket(), item.getName()));
catch (IOException e)
//Error handling
Extremadamente tarde para la fiesta, pero aquí están las búsquedas actuales de Google. Podemos eliminar múltiples blobs de manera eficiente aprovechando com.google.cloud.storage.StorageBatch
.
Al igual que:
public static void rmdir(Storage storage, String bucket, String dir)
StorageBatch batch = storage.batch();
Page blobs = storage.list(bucket, Storage.BlobListOption.currentDirectory(),
Storage.BlobListOption.prefix(dir));
for(Blob blob : blobs.iterateAll())
batch.delete(blob.getBlobId());
batch.submit();
Esto debería ejecutarse MUCHO más rápido que eliminar uno por uno cuando su cubo/carpeta contiene una cantidad no trivial de elementos.
Editar ya que esto está recibiendo un poco de atención, haré una demostración del manejo de errores:
public static boolean rmdir(Storage storage, String bucket, String dir)
List> results = new ArrayList<>();
StorageBatch batch = storage.batch();
try
Page blobs = storage.list(bucket, Storage.BlobListOption.currentDirectory(),
Storage.BlobListOption.prefix(dir));
for(Blob blob : blobs.iterateAll())
results.add(batch.delete(blob.getBlobId()));
finally
batch.submit();
return results.stream().allMatch(r -> r != null && r.get());
Este método: Eliminará cada blob en la carpeta dada del depósito dado que regresa true si es así. El método volverá false de lo contrario. Uno puede buscar en el método de retorno de batch.delete()
para una mejor comprensión y corrección de errores.
Para asegurarse de que TODOS los elementos se eliminen, puede llamar a esto como:
boolean success = false
while(!success))
success = rmdir(storage, bucket, dir);
Me doy cuenta de que esta es una vieja pregunta, pero me topé con el mismo problema y encontré una forma diferente de resolverlo.
Él Storage
La clase en Google Cloud Java Client for Storage incluye un método para enumerar los blobs en un depósito, que también puede aceptar una opción para establecer un prefix para filtrar los resultados a blobs cuyos nombres comienzan con el prefix.
Por ejemplo, eliminar todos los archivos con un determinado prefix de un balde se puede lograr así:
Storage storage = StorageOptions.getDefaultInstance().getService();
Iterable blobs = storage.list("bucket_name", Storage.BlobListOption.prefix("prefix")).iterateAll();
for (Blob blob : blobs)
blob.delete(Blob.BlobSourceOption.generationMatch());
Si haces scroll puedes encontrar las notas de otros administradores, tú además tienes el poder dejar el tuyo si lo crees conveniente.