使用BlobContainerClient调用ListBlobsByHierarchy枚举ADLS根目录问题
解决ADLS HNS账户下BlobContainerClient枚举根目录丢失目录的问题
问题分析
在启用分层命名空间(HNS)的ADLS存储账户中,通过Azure门户创建的dir1是实际的目录资源,而非传统Blob存储的虚拟目录。默认调用ListBlobsByHierarchy并传入"/"作为分隔符时,该方法只会返回Blob对象(如blob1),不会主动包含HNS目录对象,导致根目录下的dir1无法被枚举到;而移除分隔符会遍历所有层级的对象,引发性能问题。
解决方案
调用ListBlobsByHierarchy时,显式指定包含目录对象的枚举特性,即可在分层枚举时同时获取根目录下的目录和Blob,无需遍历所有子资源。
示例代码(Azure.Storage.Blobs v12+)
using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; var connectionString = "your-storage-connection-string"; var containerName = "your-container-name"; var containerClient = new BlobContainerClient(connectionString, containerName); // 枚举根目录,指定包含目录对象 var blobsAndDirectories = containerClient.ListBlobsByHierarchy( separator: "/", traits: BlobTraits.Directories, // 关键:指定包含目录 states: BlobStates.None); await foreach (var item in blobsAndDirectories) { if (item.IsDirectory) { Console.WriteLine($"根目录下的目录:{item.Name}"); // 会输出 dir1/ } else { Console.WriteLine($"根目录下的Blob:{item.Name}"); // 会输出 blob1 } }
说明
BlobTraits.Directories参数会告诉API在枚举时包含HNS目录对象,这样就能在根目录层级同时获取dir1和blob1。- 该方法仅枚举当前层级的对象,不会递归遍历子目录内容(如
dir1/blob2),避免了性能损耗。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

