如何递归加载Azure blob文件列表?

mik*_*k-t 10 c# azure azure-storage-blobs

Azure blob文件存储在没有任何物理文件夹结构的普通列表中,但我们可以创建虚拟文件夹,其中每个文件的文件夹路径都是其名称的一部分.

它带来了另一个问题,如何仅使用该文件夹的名称检索虚拟子文件夹中的所有文件列表?

Gau*_*tri 29

实际上,有一种更简单的方法,它可以在库本身中使用.如果你看一下CloudBlobContainer.ListBlobs方法,它会接受两个参数:

  1. prefix:这是您的目录的名称.如果它是嵌套目录,则需要指定完整路径,例如myfolder/mysubfolder.
  2. useFlatBlobListing:将此值设置为true将确保仅返回blob(包括该目录中的任何子文件夹内),而不是目录和blob.

        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);
    
    Run Code Online (Sandbox Code Playgroud)

您将获得属于blobs变量中"container-directory"的所有blob的列表.


mik*_*k-t 15

此静态类BlobHelper将加载给定blob文件夹中所有blob文件的列表及其所有子文件夹.

只需将其称为:

var blobs = BlobHelper.ListFolderBlobs("blob-container-name", "container-directory");
Run Code Online (Sandbox Code Playgroud)

这是完整的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;
}
}
Run Code Online (Sandbox Code Playgroud)

  • 对于像我这样开始在.NET中使用BlobStorage的人们来说,此注释是有用信息的金矿。荣誉! (3认同)
  • 那里的代码真不错。扔掉我刚刚使用过的所有内容,并根据自己的需要对其进行一些修改。 (2认同)