如何获取Blob存储中容器中所有文件夹的列表?

时间:2017-05-26 15:25:13

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

我正在使用Azure Blob存储来存储我的一些文件。我将它们分类在不同的文件夹中。

到目前为止,我可以使用以下方法获取容器中所有blob的列表:

    public async Task<List<Uri>> GetFullBlobsAsync()
    {
        var blobList = await Container.ListBlobsSegmentedAsync(string.Empty, true, BlobListingDetails.None, int.MaxValue, null, null, null);

        return (from blob in blobList.Results where !blob.Uri.Segments.LastOrDefault().EndsWith("-thumb") select blob.Uri).ToList();
    }

但是我怎么才能获取文件夹,然后才能获得该特定子目录中的文件?

这是在ASP.NET Core btw

编辑:

容器结构如下所示:

Container  
|  
|  
____Folder 1  
|   ____File 1  
|   ____File 2  
|   
|  
____Folder 2   
    ____File 3  
    ____File 4  
    ____File 5  
    ____File 6  

2 个答案:

答案 0 :(得分:5)

不是将true作为值传递给bool useFlatBlobListing参数,而是记录here传递false。这将只为您提供容器中的顶层子文件夹和blob

  

useFlatBlobListing(Boolean)

     

一个布尔值,指定是否在平面列表中列出blob,或者是否按虚拟目录分层列出blob。

要进一步缩小设置以仅列出文件夹,您可以使用OfType

    public async Task<List<Cloud​Blob​Directory>> GetFullBlobsAsync()
    {
        var blobList = await Container.ListBlobsSegmentedAsync(string.Empty, false, BlobListingDetails.None, int.MaxValue, null, null, null);

        return (from blob in blobList
                             .Results
                             .OfType<CloudBlobDirectory>() 
                select blob).ToList();
    }

这将返回Cloud​Blob​Directory个实例的集合。它们反过来也提供ListBlobsSegmentedAsync方法,因此您可以使用该方法获取该目录中的blob。

顺便说一句,既然您没有真正使用细分,为什么不使用比ListBlobs更简单的ListBlobsSegmentedAsync方法?

答案 1 :(得分:0)

为了只列出容器内的文件夹而不列出内容(对象),可以将以下内容用于Scala。这是获取子目录的通用方法,可以用于更棘手的结构,例如

Container  
|  
|  
____Folder 1  
|   ____Folder 11  
|   ____Folder 12  
|   |.  ____File 111.txt
|   |   
____Folder 2   
    ____Folder 21 
    ____Folder 22  

前缀基本上是您要查找其子目录的路径。确保将'/'分隔符添加到前缀。

val container: CloudBlobContainer = blobClient.getContainerReference(containerName)
var blobs = container.listBlobs(prefix + '/' ,false, util.EnumSet.noneOf(classOf[BlobListingDetails]), null, null)  

在listBlobs函数中,第二个参数用于使用FlatBlobListing,我们将其设置为false,因为我们只需要子目录而不需要它们的内容。我们可以将其他参数设置为null。 Blob将包含子目录列表。您可以通过遍历blob列表并调用getUri函数来获取URL。