仅获取容器中Azure blob文件的所有名称?

时间:2017-03-07 12:10:02

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

我希望Azure Blob文件中的所有名称都在容器中(出于特定目的)。我发现了一些类似的问题,甚至是stackoverflow.com上的问题(getting list of names of Azure blob files in a container?)。但所有这些答案首先使用ListBlobs() - 方法。这是我想要防止的,因为有24,000个文件,所有文件存储在列表中并且从每个文件接收名称大约需要10分钟。方法我现在使用在C#

            var container = GetOrCreateBlobContainer(containerName);
            var blobs = container.ListBlobs(useFlatBlobListing: true);
            var blobNames = blobs.OfType<CloudBlockBlob>().Select(b => b.Name).ToList();
            return blobNames;

我想要的:直接从存储中获取所有名称,而不首先使用container.ListBlobs()。

这可能吗?

3 个答案:

答案 0 :(得分:3)

  

我想要的是:直接从存储中获取所有名称而不使用   container.ListBlobs()首先。

     

这可能吗?

不,这是不可能的。您需要调用ListBlobs来获取容器中所有blob的列表。

答案 1 :(得分:2)

对于有同样问题的人,我想澄清一些事情。这是需要10分钟的方法。这是因为我们循环遍历所有24,000个文件以获取名称:

public IEnumerable<string> GetAllBlobNames(string containerName)
{
    try
    {
        var container = GetOrCreateBlobContainer(containerName);
        var blobs = container.ListBlobs(useFlatBlobListing: true);

        var blobNames = new List<string>();
        foreach (var item in blobs)
        {
            var blob = (CloudBlockBlob)item;
            blob.FetchAttributes();
            blobNames.Add(blob.Name);
        }
        return blobNames;
    }
    catch (Exception ex)
    {
        throw new DomainException("BlobStorageProvider_Retrieve_Fails", typeof(Properties.Resources), containerName, ex.ToStringExtended());
    }
}

经过一番研究后,我们将代码更改为:

var container = GetOrCreateBlobContainer(containerName);
var blobs = container.ListBlobs(useFlatBlobListing: true);
var blobNames = blobs.OfType<CloudBlockBlob>().Select(b => b.Name).ToList();
return blobNames;

第二种方式的持续时间为2秒。这比10分钟快得多。但我们仍然想知道是否必须使用container.ListBlobs()

正如Gaurav Mantri所说,如果不先使用container.ListBlobs()直接从存储中获取所有名称是不可能的。希望这也有助于其他人;)

答案 2 :(得分:0)

正如Gaurav Mantri所说,你需要先调用ListBlobs来获取容器中所有blob的列表。

这是一种变通方法,我建议您使用容器的元数据或上传txt文件来存储所有blob名称,然后您可以直接下载元数据或txt文件以获取所有blob名称。

注意:元数据最大大小为8kb,如果你有很多文件,我建议你可以使用txt存储文件名。