Jun*_*ior 5 c# azure azure-storage-blobs azure-blob-storage
我有一个使用C#Core .NET 2.2框架顶部编写的控制台应用程序.
我正在尝试使用C#库来获取容器中所有目录的列表.据我所知,Azure Blob存储没有真正的目录.相反,它会创建虚拟名称,使blob看起来像Azure Blob Explorer等浏览器中容器内的文件夹
我使用以下代码存储我的文件
CloudBlockBlob blockBlob = container.GetBlockBlobReference("foldername/filename.jpg");
await blockBlob.UploadFromStreamAsync(stream);
Run Code Online (Sandbox Code Playgroud)
所以我想在容器内选择一个不同的前缀名称文件夹名称列表.
所以,如果我有以下blob"foldername1/file1.jpg","foldername1/file2.jpg","foldername1/file3.jpg"和"foldername2/file1.jpg".我想要返回"foldername1","foldername2"
如何从Azure Blob存储中获取不同前缀的列表?
更新
我试图从下面的评论中获得反馈,所以我想出了以下代码
public async Task<string[]> Directories(string path = null)
{
int index = path == null ? 0 : path.Split('/', StringSplitOptions.RemoveEmptyEntries).Length;
BlobContinuationToken token = null;
List<string> directories = new List<string>();
do
{
BlobResultSegment blobsListingResult = await ContainerFactory.Get().ListBlobsSegmentedAsync(path ?? string.Empty, true, BlobListingDetails.None, 5000, token, null, null);
token = blobsListingResult.ContinuationToken;
IEnumerable<IListBlobItem> blobsList = blobsListingResult.Results;
foreach (var item in blobsList)
{
var blobName = (item as CloudBlob).Name;
var blobParts = blobName.Split('/', StringSplitOptions.RemoveEmptyEntries);
if (blobParts.Length <= index)
{
// At this point, we know that this not a directory inside the provided path directory
continue;
}
directories.Add(blobParts[index]);
}
}
while (token != null);
return directories.Distinct().ToArray();
}
Run Code Online (Sandbox Code Playgroud)
由于我在容器中有很多blob,这需要太长时间,因为它必须几乎获得每个块才能获得目录列表.另外,这可能非常昂贵,因为每次调用此方法时我都必须读取每个blob.
Directory.GetDirectories(path)如果一切都在本地运行,我基本上需要与运行时相同的结果!有没有办法改善这个功能?
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |