2015-05-15 4 views
8

Azure BLOB-Dateien werden in einer einfachen Liste ohne physische Ordnerstruktur gespeichert, aber wir können virtuelle Ordner erstellen, in denen der Ordnerpfad jeder Datei Teil des Namens ist.Wie wird die Liste der Azure Blob-Dateien rekursiv geladen?

Es bringt ein anderes Problem, wie Sie eine Liste aller Dateien im virtuellen Unterordner abrufen, nur mit dem Namen dieses Ordners?

Antwort

19

Eigentlich gibt es einen einfacheren Weg, das zu tun, und es ist in der Bibliothek selbst zur Verfügung. Wenn Sie bei CloudBlobContainer.ListBlobs Methode suchen, nimmt es zwei Parameter:

  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. Mein Ordner/Mein Unterordner.
  2. useFlatBlobListing: Wenn dieser Wert auf true wird sichergestellt, dass nur Blobs (einschließlich der darin enthaltenen Unterordner in diesem Verzeichnis) und nicht die 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 gehören, in der "Container-Verzeichnis" in blobs Variable erhalten.

+0

das sieht viel einfacher aus, ich werde es ausprobieren !! ich danke Ihnen für das Teilen –

8

Diese statische Klasse BlobHelper lädt die Liste aller BLOB-Dateien in einem gegebenen BLOB-Ordner und alle zugehörigen Unterordner.

Rufen Sie es wie folgt aus:

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

Hier ist voll 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; 
} 
} 
+0

Dank für diese, aber was ist das accountSlug gemeint sein? Ich bekomme dort eine Ausnahme. – Craig

+0

@Craig, ich glaube das sollte 'containerName' sein, stattdessen habe ich das korrigiert, es sollte jetzt funktionieren. Überprüfen Sie auch diese Antwort, es kann sogar eine einfachere Lösung haben: http://StackOverflow.com/a/30272025/448816. –

+0

Danke, es funktioniert. Es listet jedoch nur ein Verzeichnis auf. Suche nach einem vollen Baum, von oben nach unten, Auflistung. Jetzt versuchen, dies zu Razor zu konvertieren: http://www.codeproject.com/Articles/597939/ModelingplusaplusDirectoryplusStructureplusonplusA. Danke nochmal. – Craig

0

Von Gaurav Mantris Antwort, hier ist eine einfache Möglichkeit, die Dateien rekursiv als eine Hierarchie anzuzeigen.

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

Nutzung:

new UriNode(container);