Saltar al contenido

Cómo eliminar una carpeta dentro de un contenedor de blobs de Azure

Ya no necesitas buscar más en internet porque estás al lugar justo, tenemos la solución que buscas y sin problemas.

Solución:

Windows Azure Blob Storage no tiene el concepto de carpetas. La jerarquía es muy simple: cuenta de almacenamiento > contenedor > blob. De hecho, eliminar una carpeta en particular es eliminar todos los blobs que comienzan con el nombre de la carpeta. Puede escribir el código simple como se muestra a continuación para eliminar sus carpetas:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("your storage account");
CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference("pictures");
foreach (IListBlobItem blob in container.GetDirectoryReference("users").ListBlobs(true))
 blob.GetType().BaseType == typeof(CloudBlob))
    
        ((CloudBlob)blob).DeleteIfExists();
    

contenedor.GetDirectoryReference(“usuarios”).ListBlobs(true) enumera los blobs que comienzan con “usuarios” dentro del contenedor “imagen”, luego puede eliminarlos individualmente. Para eliminar otras carpetas, solo necesita especificar así GetDirectoryReference(“nombre de su carpeta”).

También hay un explorador de almacenamiento de escritorio de Microsoft. Tiene una función en la que puede seleccionar la carpeta virtual y luego eliminarla eliminando efectivamente todos los subblobs.

https://azure.microsoft.com/en-us/features/storage-explorer/

Comencemos con un ejemplo de cómo eliminar una “carpeta” usando ListBlobsSegmentedAsyc:

var container = // get container reference
var ctoken = new BlobContinuationToken();
do

    var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
    ctoken = result.ContinuationToken;
    await Task.WhenAll(result.Results
        .Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())
        .Where(task => task != null)
    );
 while (ctoken != null);

Que hace…

var ctoken = new BlobContinuationToken();

Una “carpeta” puede contener muchos archivos. ListBlobSegmentedAsyc puede devolver solo una parte de ellos. Este token almacenará la información sobre dónde continuar en la próxima llamada.

var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
  • El primer argumento es el nombre del blob requerido (“ruta”) prefix.
  • Segundo argumento “useFlatBlobListing=true” le dice al cliente que devuelva todos los elementos en todas las subcarpetas. Si se establece en falsese ejecutará en modo de “carpetas virtuales” y se comportará como un sistema de archivos.
  • El ctoken le dirá a Azure dónde continuar

Para conocer todos los argumentos, consulte https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudblobclient.listblobssegmentedasync?view=azure-dotnet para obtener detalles.

(item as CloudBlob)?.DeleteIfExistsAsync()

Ahora tenemos una lista de IListBlobItem en result.Results. Debido a que no se garantiza que un IListBlobItem sea un CloudBlob eliminable (por ejemplo, podría ser una carpeta virtual si hubiéramos configurado useFlatBlobListing=false), intentamos lanzarlo y eliminarlo si es posible.

result.Results.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())

Activa la eliminación de todos los resultados y devuelve una lista de tareas.

.Where(task => task != null)

Si los resultados contenían elementos que no pudimos enviar a CloudBlob, nuestra lista de tareas contiene null valores. Tenemos que quitarlos.

… luego esperamos hasta que finalice la eliminación del segmento actual y continuamos con el siguiente segmento si está disponible.

Aquí tienes las comentarios y puntuaciones

Si te ha sido útil este post, sería de mucha ayuda si lo compartieras con más juniors y nos ayudes a dar difusión a este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *