You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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中拆分出容器名和查询前缀,按以下步骤实现即可:

  1. 拆分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)
  2. 调用服务端前缀查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 01:15:04