2017-03-07 50 views
1

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

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

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

这可能吗?

回答

2

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

这可能吗?

不,这是不可能的。您将需要致电ListBlobs以获取容器中所有斑点的列表。

0

由于Gaurav Mantri说您需要先调用ListBlobs来获取容器中所有斑点的列表。

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

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

+0

感谢您的评论,但文件每天都在变化,所以保持txt文件是最新的将是不可能的。 –

2

对于有同样问题的人,我想清除一些事情。这是需要10分钟的方法。这是因为我们通过所有24000个文件循环的事实得到名称:

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(),直接从存储器中获取所有名称是不可能的。希望这可以帮助其他人;)

相关问题