代码之家  ›  专栏  ›  技术社区  ›  Expressingx

Azure存储blobs nuget,在没有文件的子目录上过滤

  •  0
  • Expressingx  · 技术社区  · 5 年前

    我是Azure的新手,在我的.Net应用程序中玩blob。

    我想能够得到结构与文件夹,子文件夹和文件内。

    现在,我已经想出了一个方法,从所有文件夹和子文件夹的文件与家长一起。 除了解析这些文件的父文件的前缀之外,还有其他方法获得文件夹结构吗?

    文件结构如下:

    root container
     -folder1
       -subfolder1
           -file
           -file
       -subfolder2
           -file
       -file
     -file
    

    我尝试过,但它只提供根目录中的文件夹,没有子文件夹:

                //returns account, client and container
                var blobData = GetBlobDetails(blobConnectionString, rootContainerName); 
    
                var rootContainer = blobData.Container;
                var blobList =  rootContainer.ListBlobsSegmentedAsync(string.Empty, false, BlobListingDetails.None, int.MaxValue, null, null, null);
    
                return (from blob in blobList.Result
                        .Results
                        .OfType<CloudBlobDirectory>()
                    select blob).ToList();
    
    0 回复  |  直到 5 年前
        1
  •  14
  •   silent    5 年前

    首先,正如评论中指出的:Blob存储不知道文件夹的概念。都是一个平面结构,下面的前缀都是blob(=文件)路径的一部分。

    也就是说,您可以通过遍历前缀来复制行为:

    使用 Azure.Storage.Blobs 12.2.0

    using Azure;
    using Azure.Storage.Blobs;
    using Azure.Storage.Blobs.Models;
    using System;
    using System.Threading.Tasks;
    using System.Linq;
    
    namespace BlobLister
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                // Get a connection string to our Azure Storage account.
                string connectionString = "*****";
                string containerName = "mycontainer";
    
                Console.WriteLine($"Recursivly listing blobs and virtual directories for container '{containerName}'");
    
                BlobContainerClient container = new BlobContainerClient(connectionString, containerName);
                await ListBlobsForPrefixRecursive(container, "", 0);
            }
    
            public static async Task ListBlobsForPrefixRecursive(BlobContainerClient container, string prefix, int level)
            {         
                string spaces = new string(' ', level);
                Console.WriteLine($"{spaces}- {prefix}");
                await foreach (Page<BlobHierarchyItem> page in container.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: "/").AsPages())
                {
                    foreach (var blob in page.Values.Where(item => item.IsBlob).Select(item => item.Blob))
                    {
                        Console.WriteLine($"{spaces} {blob.Name}");
                    }
                    var prefixes = page.Values.Where(item => item.IsPrefix).Select(item => item.Prefix);
                    foreach (var p in prefixes)
                    {
                        await ListBlobsForPrefixRecursive(container, p, level + 1);
                    }
                }
            }
        }
    }
    
    推荐文章