我希望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()。
这可能吗?
答案 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存储文件名。