Более простой способ получения имен каталогов только из контейнера BLOB-объектов - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь получить имена каталогов только для любых каталогов в указанном c месте с хранилищем BLOB-объектов

У меня есть вспомогательный класс ниже

public static class BlobHelper
{
    private static CloudBlobContainer _cloudBlobContainer;
    private const string _containerName = "administrator";

    public static void Setup(string connectionString)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
        CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
        _cloudBlobContainer = cloudBlobClient.GetContainerReference(_containerName);

    }


    public static List<string> GetDirectoryNames(string relativeAddress)
    {
        var result = new List<string>();
        var directory = _cloudBlobContainer.GetDirectoryReference(relativeAddress);
        var folders = directory.ListBlobs().OfType<CloudBlobDirectory>();

        foreach (var folder in folders)
        {
            var name = folder.Uri.AbsolutePath;
            name = name.Replace(folder.Parent.Prefix, string.Empty)
                .Replace(@"/", string.Empty)
                .Replace(_containerName, string.Empty);

            result.Add(name);
        }
    }
}

Процесс получения только имена каталогов (т.е. не полная иерархия) кажутся немного странными, хотя это работает

Есть ли лучший способ сделать это?

Я попробовал подход ниже

var directory = _cloudBlobContainer.GetDirectoryReference(relativeAddress);        
var blobs = directory.ListBlobs(true).OfType<CloudBlobDirectory>();;
var blobNames = blobs.OfType<CloudBlockBlob>().Select(b => b.Name).ToList();
return blobNames;

Основным отличием от вышесказанного является использование UseFlatBlobListing как true

Однако этот подход не приводит к тому, что папки вообще не возвращаются, тогда как другие мои логи c по крайней мере дают мне 2 папки, которые я ожидаю найти

Есть идеи, что я делаю не так?

Приветствия

Пол

1 Ответ

0 голосов
/ 11 марта 2020

Полагаю, с вашим кодом все в порядке, я не понимаю, что вы имеете в виду "немного хакерский". Я думаю, что вы хотите получить каталог напрямую.

Потому что никакой каталог методов не получает каталог, так как теперь известный способ сделать это с v11 sdk в основном использует blob uri, чтобы сделать это.

И ниже мой способ сделать это.

            CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("test");

            BlobContinuationToken blobContinuationToken = null;

            var blobsSeg = cloudBlobContainer.ListBlobsSegmented(null, blobContinuationToken);

            var directories= blobsSeg.Results.OfType<CloudBlobDirectory>().Select(b => b.Prefix).ToList();
            foreach (string directory in directories) {
                Console.WriteLine(directory);
            }

Результат, который он возвращает, будет таким, как показано ниже pi c. Надеюсь, это поможет вам.

enter image description here

...