如何获取Azure存储容器中所有文件夹及子文件夹名称?
获取Azure Blob存储容器中所有层级的子文件夹列表
你的现有代码仅能获取根目录下的主文件夹,原因是GetBlobsByHierarchy调用时指定的prefix为"/",只会返回根目录下的第一层前缀(主文件夹)。要获取所有子文件夹,需要逐层遍历每个主文件夹下的前缀。
若之前尝试的代码无响应,通常是因为未处理API的分页返回,或是递归逻辑未正确终止,导致程序卡在大量数据加载或无限循环中。Azure Blob的GetBlobsByHierarchy返回Pageable<T>类型结果,必须分页遍历,而非直接调用ToList()一次性加载所有数据——尤其是文件夹数量较多时,一次性加载会引发内存占用过高或请求超时问题。
解决方案代码
递归遍历方式(适合层级较少的场景)
string connectionString = _configuration.GetConnectionString("ArchivadoHistoricoOfertas"); BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("ofertas"); // 启动递归遍历 await GetAllFolderPrefixes(containerClient, string.Empty); async Task GetAllFolderPrefixes(BlobContainerClient containerClient, string currentPrefix) { // 获取当前前缀下的所有子文件夹前缀 var pageable = containerClient.GetBlobsByHierarchy(BlobTraits.None, BlobStates.None, currentPrefix, delimiter: "/"); await foreach (var page in pageable.AsPages()) { foreach (var prefixItem in page.Values.Where(b => b.IsPrefix)) { Console.WriteLine("Folder Prefix: " + prefixItem.Prefix); // 递归遍历当前子文件夹下的下一层级 await GetAllFolderPrefixes(containerClient, prefixItem.Prefix); } } }
迭代遍历方式(适合层级较深的场景,避免栈溢出)
string connectionString = _configuration.GetConnectionString("ArchivadoHistoricoOfertas"); BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("ofertas"); // 用队列存储待遍历的文件夹前缀 var prefixQueue = new Queue<string>(); prefixQueue.Enqueue(string.Empty); while (prefixQueue.Count > 0) { var currentPrefix = prefixQueue.Dequeue(); var pageable = containerClient.GetBlobsByHierarchy(BlobTraits.None, BlobStates.None, currentPrefix, delimiter: "/"); await foreach (var page in pageable.AsPages()) { foreach (var prefixItem in page.Values.Where(b => b.IsPrefix)) { Console.WriteLine("Folder Prefix: " + prefixItem.Prefix); // 将子文件夹前缀加入队列,继续遍历 prefixQueue.Enqueue(prefixItem.Prefix); } } }
关键说明
- 使用
AsPages()分页遍历结果,避免一次性加载大量数据导致的性能问题。 - 通过递归或迭代方式逐层遍历每个文件夹前缀,确保所有层级的子文件夹都被获取。
- 指定
delimiter: "/"让API按路径分隔符识别文件夹层级,正确返回子文件夹前缀。
内容的提问来源于stack exchange,提问作者kintela
相关产品推荐
相关产品推荐

