2015-05-15 4 views
8

Файлы Azure blob хранятся в обычном списке без какой-либо физической структуры папок, но мы можем создавать виртуальные папки, в которых путь к папке каждого файла является частью его имени.Как загрузить список файлов Azure blob рекурсивно?

Появляется еще одна проблема: как получить список ВСЕХ файлов в виртуальной подпапке, используя только имя этой папки?

ответ

19

На самом деле, есть более простой способ сделать это, и это доступно в самой библиотеке. Если вы посмотрите на CloudBlobContainer.ListBlobs метод, она принимает два параметра:

  1. префикс: Это имя каталога. Если это вложенный каталог, вам нужно указать полный путь, например. моя_папка/mysubfolder.
  2. useFlatBlobListing: Установка значения true будет гарантировать, что только сгустки будут возвращены (в том числе внутри любых вложенных папок внутри этой директории), а не каталоги и капли.

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

Вы получите список всех сгустков, входящих в «контейнер-каталог» в blobs переменной.

+0

, что выглядит намного проще, я попробую! Спасибо, что поделились –

8

Этот статический класс BlobHelper загрузит список всех файлов blob в данной папке blob и всех ее подпапках.

Просто назвать это так:

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

Вот полный 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; 
} 
} 
+0

Спасибо за это, но что accountSlug значит быть? Там я получаю исключение. – Craig

+0

@Craig, я считаю, что вместо этого нужно «containerName», я получил исправление, теперь оно должно работать. Также проверьте этот ответ, это может быть даже более простое решение: http://stackoverflow.com/a/30272025/448816. –

+0

Спасибо, заработал. Однако он содержит только один каталог. Ищете полное дерево, сверху вниз, листинг. Теперь попытаемся преобразовать это в Razor: http://www.codeproject.com/Articles/597939/ModelingplusaplusDirectoryplusStructureplusonplusA. Еще раз спасибо. – Craig

0

Из ответа Гаурава Мантри, вот простой способ показать файлы рекурсивно как иерархию.

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

использование:

new UriNode(container);