【问题标题】:Getting list of names of Azure blob files in a container?获取容器中 Azure blob 文件的名称列表?
【发布时间】:2014-06-22 12:35:29
【问题描述】:

我需要列出 Azure Blob 文件名的名称。目前我可以列出所有带有 URL 的文件,但我只需要名称列表。我想避免解析名称。你能看看我下面的代码和指南吗:

CloudStorageAccount backupStorageAccount = CloudStorageAccount.Parse(blobConectionString);

var backupBlobClient = backupStorageAccount.CreateCloudBlobClient();
var backupContainer = backupBlobClient.GetContainerReference(container);

var list = backupContainer.ListBlobs();

【问题讨论】:

  • 您的 Blob 容器是否只包含块 Blob?如果是这种情况,那么您可以简单地执行以下操作:List<string> blobNames = list.Select(b => (b as CloudBlockBlob).Name);

标签: c# .net azure azure-blob-storage


【解决方案1】:

您可以访问BlobProperties 获取名称:

foreach (object o in list)
{
    BlobProperties bp = o as BlobProperties;
    if (bp != null)
    {
        BlobProperties p = _Container.GetBlobProperties(bp.Name);
        var name = p.Name; // get the name
    }
}

【讨论】:

  • 谢谢。请问可以在 Lambda/Linq 中完成吗?也只是这样想,它会为每个 blob 文件调用 GetBlobProperties 函数,对吗?请您的建议。
  • 什么是list
【解决方案2】:

如果您使用的是 Windows Azure Storage 4.3.0,请尝试此代码。

List<string> blobNames = list.OfType<CloudBlockBlob>().Select(b => b.Name).ToList();

【讨论】:

  • 我们可以获得一些额外的信息,例如尺寸、修改日期等。在底部参考我的答案。
  • 什么是list
  • list 可以在上面的提问者帖子中找到。
  • 答案已过时 - ListBlobs 不再可用 - 请参阅此答案:stackoverflow.com/a/59474285/10133085
【解决方案3】:

这是完成此任务的另一种方法:

CloudStorageAccount backupStorageAccount = CloudStorageAccount.Parse(blobConectionString);

var backupBlobClient = backupStorageAccount.CreateCloudBlobClient();
var backupContainer = backupBlobClient.GetContainerReference(container);

// useFlatBlobListing is true to ensure loading all files in
// virtual blob sub-folders as a plain list
var list = backupContainer.ListBlobs(useFlatBlobListing: true);
var listOfFileNames = new List<string>();

foreach (var blob in blobs) {
  var blobFileName = blob.Uri.Segments.Last();
  listOfFileNames.Add(blobFileName); 
}

return listOfFileNames;

来源:How to load list of Azure blob files recursively?

【讨论】:

  • 我认为list 应该更新为blobs。即var blobs = backupContainer.ListBlobs(useFlatBlobListing: true);
【解决方案4】:

详细回答。

        // Parse the connection string and return a reference to the storage account.
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("AzureBlobConnectionString"));

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve reference to a previously created container.
        CloudBlobContainer container = blobClient.GetContainerReference("container_name");

        // Retrieve reference to a blob named "test.csv"
        CloudBlockBlob blockBlob = container.GetBlockBlobReference("BlobName.tex");

        //Gets List of Blobs
        var list = container.ListBlobs();
        List<string> blobNames = list.OfType<CloudBlockBlob>().Select(b => b.Name).ToList();

【讨论】:

  • 我遇到了关于名称中带有空格的 blob 的问题。我使用的是绝对 uri,但它没有达到我的目的。这个答案为我解决了问题。
  • 很高兴能帮上忙。
【解决方案5】:

我们可以获得一些附加信息,例如尺寸、修改日期名称

CloudStorageAccount backupStorageAccount = CloudStorageAccount.Parse(YOUR_CON_STRING);

var backupBlobClient = backupStorageAccount.CreateCloudBlobClient();
var backupContainer = backupBlobClient.GetContainerReference("CONTAINER");


var blobs = backupContainer.ListBlobs().OfType<CloudBlockBlob>().ToList();

foreach (var blob in blobs)
{
    string bName = blob.Name;
    long bSize = blob.Properties.Length;
    string bModifiedOn = blob.Properties.LastModified.ToString();        
}

您还可以按名称下载特定文件。

 // Download file by Name
 string fileName = "Your_file_name";
 CloudBlockBlob blobFile = backupContainer.GetBlockBlobReference(fileName);
 blobFile.DownloadToFile(@"d:\"+ fileName, System.IO.FileMode.Create);

【讨论】:

    【解决方案6】:

    这适用于 WindowsAzure.Storage 9.3.3

    CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
    var cloudBlobContainer = cloudBlobClient.GetContainerReference(containerName);
    
    var blobResultSegment = await cloudBlobContainer.ListBlobsSegmentedAsync(continuationToken);
    var blobs = blobResultSegment.Results.Select(i => i.Uri.Segments.Last()).ToList();
    

    【讨论】:

    • 什么是continuationToken??
    • BlobContinuationToken continuationToken = null;
    • @PetraStručić 请提供一些信息,您给出的评论没有帮助!
    • @Peter 请提供一些信息,您给出的评论没有帮助!更严肃地说,我认为我的评论对于整个线程的上下文是不言自明的,但你能问一个具体的问题吗?如果可能的话,我想改进我的评论。
    • 我专注于原始问题的范围,但可以肯定。由于获取所有 blob 可能是一项繁重的操作,因此最好使用 maxResults 参数将其分成更小的块。 ContinuationToken 跟踪留待列出的记录数。在我的这个具体代码示例中,没有使用它的潜力。这是它的使用示例:do { var response = await ListBlobsSegmentedAsync(continuationToken); continuationToken = response.ContinuationToken; results.AddRange(response.Results); } while (continuationToken != null);
    【解决方案7】:
      CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
       CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
        CloudFileShare share = fileClient.GetShareReference(ConfigurationManager.AppSettings["ShareReference"]);
        if (share.Exists())
        {
              CloudFileDirectory rootDir = share.GetRootDirectoryReference();
              CloudFileDirectory sampleDir = rootDir.GetDirectoryReference("paths");
              if (sampleDir.Exists())
              {
                    IEnumerable<IListFileItem> fileList = sampleDir.ListFilesAndDirectories();
                     //CloudFile file = sampleDir.GetFileReference(FileName + ext);
                     //return file;
               }
               return null;
          }
    

    从fileList中可以获取azure文件中的所有文件

    【讨论】:

      【解决方案8】:

      ListBlobs 方法似乎不再存在。这是一个异步版本。

          public static async Task<List<string>> ListBlobNamesAsync(CloudBlobContainer container)
          {
              var blobs = await ListBlobsAsync(container);
              return blobs.Cast<CloudBlockBlob>().Select(b => b.Name).ToList();
      
              //Alternate version
              //return blobs.Select(b => b.Uri.ToString()).Select(s => s.Substring(s.LastIndexOf('/') + 1)).ToList();
          }
      
          public static async Task<List<IListBlobItem>> ListBlobsAsync(CloudBlobContainer container)
          {
              BlobContinuationToken continuationToken = null; //start at the beginning
              var results = new List<IListBlobItem>();
              do
              {
                  var response = await container.ListBlobsSegmentedAsync(continuationToken);
                  continuationToken = response.ContinuationToken;
                  results.AddRange(response.Results);
              }
      
              while (continuationToken != null); //when this is null again, we've reached the end
              return results;
          }
      

      【讨论】:

      • 感谢您的回答。我还没有在 Azure 上设置,但我想知道,如果你知道,列出 1000 个 blob 名称的速度有多快?我知道这取决于几个因素,但只是一个非常笼统的估计会对我有所帮助。谢谢。
      • 我不记得了,除了它足够快不会惹恼我。我只有几百个对象,但我无法想象你会遇到一千个问题。
      【解决方案9】:

      更新:

      使用 Azure.Storage.Blobs v12 - 包

      获取 Azure blob 文件的名称列表
      var storageConnectionString = "DefaultEndpointsProtocol=...........=core.windows.net";
      var blobServiceClient = new BlobServiceClient(storageConnectionString);
      
      //get container
      var container = blobServiceClient.GetBlobContainerClient("container_name");
      
      List<string> blobNames = new List<string>();
      
      //Enumerating the blobs may make multiple requests to the service while fetching all the values
      //Blobs are ordered lexicographically by name
      //if you want metadata set BlobTraits - BlobTraits.Metadata
      var blobs = container.GetBlobsAsync(BlobTraits.None, BlobStates.None);
      await foreach (var blob in blobs)
      {
          blobNames.Add(blob.Name);
      }
      

      还有更多的选项和例子你可以找到它here

      这是 nuget 包的 link

      【讨论】:

        【解决方案10】:

        我们必须使用ListBlobsSegmentedAsync()方法,然后我们可以通过以下代码找到blob:

        public CloudBlockBlob GetLatestBlobByBlobNamePattern(CloudBlobContainer container, string blobNamePattern) 
                {
                    var root = container.GetDirectoryReference(string.Empty);
                    var blobsList = root.ListBlobsSegmentedAsync(null);
                    blobsList.Wait();
                    BlobResultSegment segment = blobsList.Result;
                    List<IListBlobItem> list = new List<IListBlobItem>();
                    list.AddRange(segment.Results);
                    while (segment.ContinuationToken != null)
                    {
                        var blobs = container.ListBlobsSegmentedAsync(segment.ContinuationToken);
                        blobs.Wait();
                        segment = blobs.Result;
                        list.AddRange(segment.Results);
                    }
                    var blob = list.Where(x => x.Uri.Segments.Last().Contains(blobNamePattern)).FirstOrDefault();
                    return (CloudBlockBlob)blob;
                }
        

        【讨论】:

          猜你喜欢
          • 2017-07-27
          • 2020-06-14
          • 2021-02-03
          • 2021-10-28
          • 1970-01-01
          • 2020-07-04
          • 1970-01-01
          • 2022-01-15
          相关资源
          最近更新 更多