tutorial net from example asp c# azure azure-storage-blobs

c# - net - ¿Cómo cargar la lista de archivos de blob de Azure recursivamente?



download file from azure blob storage c# (3)

En realidad, hay una forma más sencilla de hacerlo y está disponible en la biblioteca. Si CloudBlobContainer.ListBlobs método CloudBlobContainer.ListBlobs , acepta dos parámetros:

  1. prefijo : este es el nombre de su directorio. Si es un directorio anidado, deberá especificar la ruta completa, por ejemplo, myfolder / mysubfolder.
  2. useFlatBlobListing : establecer este valor en true asegurará que solo se devuelvan blobs (incluso dentro de cualquier subcarpetas dentro de ese directorio) y no directorios y blobs.

    var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true); var blobClient = account.CreateCloudBlobClient(); var container = blobClient.GetContainerReference("blob-container-name"); var blobs = container.ListBlobs(prefix: "container-directory", useFlatBlobListing: true);

Obtendrá una lista de todos los blobs que pertenecen a la variable " blobs " en el directorio "contenedor".

Los archivos de blobs de Azure se almacenan en una lista simple sin ninguna estructura de carpeta física, pero podemos crear carpetas virtuales donde la ruta de cada carpeta de archivo forma parte de su nombre.

Resultará otro problema, ¿cómo recuperar una lista de TODOS los archivos en una subcarpeta virtual, usando solo el nombre de esa carpeta?


Esta clase estática BlobHelper cargará la lista de todos los archivos blob en una carpeta blob determinada, y todas sus subcarpetas.

Solo llámalo así:

var blobs = BlobHelper.ListFolderBlobs("blob-container-name", "container-directory");

Aquí está el código completo de BlobHelper :

using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; // Class to contain list of blob files info public class BlobFileInfo { public string FileName { get; set; } public string BlobPath { get; set; } public string BlobFilePath { get; set; } public IListBlobItem Blob { get; set; } } public static class BlobHelper { // Load blob container public static CloudBlobContainer GetBlobContainer(string containerName) { var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); var blobClient = storageAccount.CreateCloudBlobClient(); var container = blobClient.GetContainerReference(containerName); return container; } // Get recursive list of files public static IEnumerable<BlobFileInfo> ListFolderBlobs(string containerName, string directoryName) { var blobContainer = GetBlobContainer(containerName); var blobDirectory = blobContainer.GetDirectoryReference(directoryName); var blobInfos = new List<BlobFileInfo>(); var blobs = blobDirectory.ListBlobs().ToList(); foreach (var blob in blobs) { if (blob is CloudBlockBlob) { var blobFileName = blob.Uri.Segments.Last().Replace("%20", " "); var blobFilePath = blob.Uri.AbsolutePath.Replace(blob.Container.Uri.AbsolutePath + "/", "").Replace("%20", " "); var blobPath = blobFilePath.Replace("/" + blobFileName, ""); blobInfos.Add(new BlobFileInfo { FileName = blobFileName, BlobPath = blobPath, BlobFilePath = blobFilePath, Blob = blob }); } if (blob is CloudBlobDirectory) { var blobDir = blob.Uri.OriginalString.Replace(blob.Container.Uri.OriginalString + "/", ""); blobDir = blobDir.Remove(blobDir.Length - 1); var subBlobs = ListFolderBlobs(containerName, blobDir); blobInfos.AddRange(subBlobs); } } return blobInfos; } }


De la respuesta de Gaurav Mantri, aquí hay una manera simple de mostrar los archivos recursivamente como una jerarquía.

public class UriNode { public Uri ThisUri { get; private set; } public IEnumerable<UriNode> Children { get; private set; } public UriNode(CloudBlobContainer container, Uri thisUri = null) { ThisUri = thisUri; if (ThisUri == null) { Children = container.ListBlobs().Select(b => new UriNode(container, b.Uri)); return; } if (!new Regex(@"//$").IsMatch(ThisUri.AbsolutePath)) return; var prefix = string.Join("/", ThisUri.Segments.Skip(2).Take(ThisUri.Segments.Length - 2)); Children = container.ListBlobs(prefix).Select(b => new UriNode(container, b.Uri)); } }

uso:

new UriNode(container);