如何通过Zimbabwe目录的Primary URI列出Azure存储下的所有子Blob对象
核心实现逻辑
Azure Blob存储本身是扁平结构,你看到的目录是虚拟结构,本质是Blob名称以/作为分隔符拼接的前缀。要实现低成本查询指定目录下的所有子对象,直接调用SDK的前缀查询能力即可,过滤逻辑由存储服务端执行,无需拉取全量Blob再本地过滤。
方案1:继续使用你当前的Microsoft.WindowsAzure.Storage旧SDK
和你之前获取CloudBlobDirectory的SDK版本完全兼容,两种实现方式可选:
如果你已经持有Zimbabwe对应的CloudBlobDirectory对象
直接调用ListBlobs方法即可:
// 你已经获取到的Zimbabwe目录的CloudBlobDirectory实例 CloudBlobDirectory zimbabweDir = ...; // useFlatBlobListing设为true表示递归获取所有层级的子Blob,设为false仅获取当前目录下的一级对象 var childBlobs = zimbabweDir.ListBlobs(useFlatBlobListing: true);
如果你仅持有Zimbabwe目录的Primary URI
直接从URI构造CloudBlobDirectory对象即可:
// 填入你拿到的Zimbabwe目录的Primary URI,若URI已带SAS令牌无需额外传凭据 Uri zimbabweUri = new Uri("你的Zimbabwe目录Primary URI"); CloudBlobDirectory zimbabweDir = new CloudBlobDirectory(zimbabweUri, new StorageCredentials()); // 获取所有子对象 var childBlobs = zimbabweDir.ListBlobs(useFlatBlobListing: true);
方案2:使用Azure.Storage.Blobs新SDK(就是你后续尝试用BlobServiceClient的版本)
你之前卡住是因为没有从URI中拆分出容器名和查询前缀,按以下步骤实现即可:
- 拆分Zimbabwe的URI,规则如下:
标准Blob URI格式为https://<存储账户名>.blob.core.chinacloudapi.cn/<容器名>/<虚拟目录路径>/
比如你的Zimbabwe URI是https://demoacc.blob.core.chinacloudapi.cn/authors/Authors/Z/Zimbabwe/,拆分后:- 容器名:
authors - 查询前缀:
Authors/Z/Zimbabwe/(注意末尾必须带/,避免匹配到前缀相似的其他Blob)
- 容器名:
- 调用服务端前缀查询API:
// 传入存储账户的连接字符串 var blobServiceClient = new BlobServiceClient("你的存储账户连接字符串"); // 传入拆分得到的容器名 var containerClient = blobServiceClient.GetBlobContainerClient("authors"); // 传入查询前缀,服务端直接返回该目录下的所有Blob,无额外开销 var childBlobs = containerClient.GetBlobs(prefix: "Authors/Z/Zimbabwe/");
如果你的Zimbabwe URI已带SAS令牌,无需使用连接字符串,可直接构造容器客户端:
Uri zimbabweUri = new Uri("你的带SAS的Zimbabwe目录URI"); // 拆分得到容器URI string[] pathSegments = zimbabweUri.AbsolutePath.TrimStart('/').Split('/'); Uri containerUri = new Uri($"{zimbabweUri.GetLeftPart(UriPartial.Authority)}/{pathSegments[0]}{zimbabweUri.Query}"); var containerClient = new BlobContainerClient(containerUri); // 拆分得到查询前缀 string prefix = string.Join("/", pathSegments.Skip(1)).TrimEnd('/') + "/"; var childBlobs = containerClient.GetBlobs(prefix: prefix);
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

