Есть ли способ получить файловую структуру из azure blob? - PullRequest
1 голос
/ 13 января 2020

Я новичок в Azure и играю с каплями в моем приложении. Net.

Я хочу иметь возможность получить структуру с папками, подпапками и файлами внутри.

Пока что я нашел способ получить файлы из всех папок и подпапок вместе с родителями. Есть ли способ получить структуру папок каким-либо другим способом, кроме анализа префикса родителей этих файлов?

Структура файла следующая:

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

Я пробовал это, но он дает мне только папку в каталоге root, без подпапок:

            //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();

1 Ответ

8 голосов
/ 13 января 2020

Прежде всего, как отмечено в комментариях: хранилище 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);
                }
            }
        }
    }
}
...