web-dev-qa-db-de.com

Wie lade ich eine Liste von Azure-Blob-Dateien rekursiv?

Azure-Blob-Dateien werden in einer einfachen Liste ohne physische Ordnerstruktur gespeichert. Wir können jedoch virtuelle Ordner erstellen, bei denen der Ordnerpfad jeder Datei Teil des Namens ist.

Es bringt ein weiteres Problem mit sich: Wie kann eine Liste ALLER Dateien im virtuellen Unterordner nur unter Verwendung des Ordnernamens abgerufen werden?

10
mik-t

Tatsächlich gibt es eine einfachere Möglichkeit, dies zu tun, und sie ist in der Bibliothek selbst verfügbar. Wenn Sie sich die Methode CloudBlobContainer.ListBlobs ansehen, werden zwei Parameter akzeptiert:

  1. Präfix : Dies ist der Name Ihres Verzeichnisses. Wenn es sich um ein verschachteltes Verzeichnis handelt, müssen Sie den vollständigen Pfad angeben, z. meinordner/meinunterordner.
  2. useFlatBlobListing : Wenn Sie diesen Wert auf true setzen, wird sichergestellt, dass nur Blobs (einschließlich aller Unterordner in diesem Verzeichnis) und keine Verzeichnisse und Blobs zurückgegeben werden.

        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);
    

Sie erhalten eine Liste aller Blobs, die zum "container-directory" in der Variable blobs gehören.

29
Gaurav Mantri

Diese statische Klasse BlobHelper lädt die Liste aller Blob-Dateien in einem bestimmten Blob-Ordner und aller seiner Unterordner.

Nennen Sie es einfach so:

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

Hier ist der vollständige BlobHelper Code:

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;
}
}
11
mik-t

Nach der Antwort von Gaurav Mantri können Sie die Dateien auf einfache Weise rekursiv als Hierarchie anzeigen.

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));
    }
}

verwendungszweck:

new UriNode(container);
0
Chad Hedgcock