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

Getting only all names of Azure blob files in container?

我想要容器中 Azure Blob 文件的所有名称(出于某种目的)。我发现了一些类似的问题,甚至是关于 whosebug.com (getting list of names of Azure blob files in a container?) 的问题。但所有这些答案都首先使用 ListBlobs() 方法。这就是我想要防止的,因为有 24,000 个文件,大约需要 10 分钟才能将所有文件存储在列表中并从每个文件中接收到名称。我现在使用的方法 in 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()。

这可能吗??

What I want: Get all names directly from the storage without using container.ListBlobs() first.

Is this possible??

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

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

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

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

对于有同样问题的人,我想澄清一些事情。这是需要 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(),就不可能直接从存储中获取所有名称。希望这也能帮助其他人 ;)