我正在使用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
答案 0 :(得分:5)
不是将true
作为值传递给bool useFlatBlobListing
参数,而是记录here传递false
。这将只为您提供容器中的顶层子文件夹和blob
useFlatBlobListing(Boolean)
一个布尔值,指定是否在平面列表中列出blob,或者是否按虚拟目录分层列出blob。
要进一步缩小设置以仅列出文件夹,您可以使用OfType
public async Task<List<CloudBlobDirectory>> 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();
}
这将返回CloudBlobDirectory个实例的集合。它们反过来也提供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。