有没有办法从 azure blob 中获取文件结构?

Jan*_*Doe 4 .net azure azure-storage-blobs azure-blob-storage

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

我希望能够获得包含文件夹、子文件夹和文件的结构。

现在,我已经想出了一种方法来与父母一起从所有文件夹和子文件夹中获取文件。除了解析这些文件的父文件的前缀之外,还有什么方法可以获得文件夹结构吗?

文件结构如下:

root container
 -folder1
   -subfolder1
       -file
       -file
   -subfolder2
       -file
   -file
 -file
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它只给我根目录中的文件夹,没有子文件夹:

            //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();
Run Code Online (Sandbox Code Playgroud)

sil*_*ent 20

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

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

使用 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);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这非常有帮助;微软的无示例文档是如此不透明,我什至不确定这就是它要解决的问题。 (4认同)