如何列出位于第三层未知文件夹中的Azure Blob?
解决方案
Azure Blob存储的prefix参数不支持通配符,只能指定固定路径前缀。要筛选第三层文件夹下的Blob,有两种可行方式:
方式1:全量遍历后过滤(实现简单)
直接列出容器内所有Blob,通过统计Blob名称中/的数量判断层级——第三层文件夹下的Blob名称至少包含3个/(对应folder1/folder2/folder3/file的结构),层级不足的会被排除。
代码示例:
public async Task<List<string>> GetThirdLevelBlobsAsync() { var blobNames = new List<string>(); // 列出容器内所有Blob,可按需添加BlobStates/BlobTypes参数过滤类型 await foreach (BlobItem blobItem in _containerClient.GetBlobsAsync()) { int slashCount = blobItem.Name.Count(c => c == '/'); // 第三层文件夹下的Blob需满足至少3个路径分隔符 if (slashCount >= 3) { blobNames.Add($"{_containerClient.Uri.AbsoluteUri}/{blobItem.Name}"); } } return blobNames; }
方式2:分层遍历(性能更优)
如果容器内Blob数量庞大,全量遍历效率较低,可通过GetBlobsByHierarchyAsync逐层遍历到第三层文件夹,再列出该层级下的Blob:
public async Task<List<string>> GetThirdLevelBlobsHierarchicalAsync() { var blobNames = new List<string>(); // 遍历第一层文件夹(如animal/、car/) await foreach (BlobHierarchyItem level1 in _containerClient.GetBlobsByHierarchyAsync(delimiter: "/")) { if (level1.IsPrefix) { // 遍历第二层文件夹(如animal/herbivore/、car/electric/) await foreach (BlobHierarchyItem level2 in _containerClient.GetBlobsByHierarchyAsync(delimiter: "/", prefix: level1.Prefix)) { if (level2.IsPrefix) { // 遍历第三层文件夹(如animal/herbivore/tall/、car/electric/tesla/) await foreach (BlobHierarchyItem level3 in _containerClient.GetBlobsByHierarchyAsync(delimiter: "/", prefix: level2.Prefix)) { if (level3.IsPrefix) { // 列出第三层文件夹下的所有Blob await foreach (BlobItem blob in _containerClient.GetBlobsAsync(prefix: level3.Prefix)) { blobNames.Add($"{_containerClient.Uri.AbsoluteUri}/{blob.Name}"); } } } } } } } return blobNames; }
关键注意点
prefix参数仅支持固定路径前缀,不允许使用*等通配符;- 方式1适合Blob数量较少的场景,实现成本低;方式2避免无效遍历,更适合大规模Blob存储;
- 统计路径分隔符时,注意Blob名称中是否存在转义的
/(通常不会出现)。
内容的提问来源于stack exchange,提问作者Patrick de Jong
相关产品推荐
相关产品推荐

