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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:40:49