Как прочитать все BLOB-объекты с разных путей в одном хранилище Azure - PullRequest
0 голосов
/ 04 ноября 2018

Я следовал руководству Microsoft по маршрутизации в Azure IoT Hub, и теперь все мои сообщения из iot hub хранятся в больших двоичных объектах в контейнере. Однако каждый BLOB-объект находится в отдельной папке. Например, сообщения отправленные 3 ноября 2018 19:53 хранятся в xyz / 00/2018/11/03/19/53 BLOB-файл. Как я могу получить все капли из всех папок в контейнере? Я не могу использовать CloudBlobContainer.ListBlobs (), потому что у меня нет этого метода. Я пробовал:

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(StorageConnectionString);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer blobContainer = blobClient.GetContainerReference(storageContainerName);
        CloudBlob blob = blobContainer.GetBlockBlobReference("xyz/00/2018/11/03/20/15");
        MemoryStream stream = new MemoryStream();
        await blob.DownloadToStreamAsync(stream);
        return Encoding.UTF8.GetString(stream.ToArray());

и этот код возвращает содержимое BLOB-объекта, расположенного в xyz / 00/2018/11/03/20/15 Однако, если я пытаюсь перебрать BLOB-объекты, используя приведенный ниже код, он возвращает только "https://{storageName}.blob.core.windows.net/{containerName}/{xyz}/"

            List<string> blobs = new List<string>();
        BlobResultSegment resultSegment = blobContainer.ListBlobsSegmentedAsync(null).Result;
        foreach (IListBlobItem item in resultSegment.Results)
        {
            if (item.GetType() == typeof(CloudBlockBlob))
            {
                CloudBlockBlob blob = (CloudBlockBlob)item;
                blobs.Add(blob.Name);
            }
            else if (item.GetType() == typeof(CloudPageBlob))
            {
                CloudPageBlob blob = (CloudPageBlob)item;
                blobs.Add(blob.Name);
            }
            else if (item.GetType() == typeof(CloudBlobDirectory))
            {
                CloudBlobDirectory dir = (CloudBlobDirectory)item;
                blobs.Add(dir.Uri.ToString());
            }
        }

        var result = String.Join(", ", blobs.ToArray());
        return result;

Что мне здесь не хватает? Как я могу получить каждый шарик из контейнера?

1 Ответ

0 голосов
/ 04 ноября 2018

Используйте перегрузку ListBlobsSegmentedAsync, которая принимает useFlatBlobListing и установите значение useFlatBlobListing в true:

useFlatBlobListing
Логическое значение, которое указывает, следует ли перечислять большие двоичные объекты в плоском списке или иерархически составлять список больших двоичных объектов по виртуальному каталогу.

( источник )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...