ListBlobs () видит только первую папку в контейнере BLOB Azure - PullRequest
0 голосов
/ 10 марта 2020

My Azure Контейнер BLOB-объектов содержит две виртуальные папки, A и B, а также некоторые файлы. Я использую этот код в своем проекте для загрузки содержимого контейнера в локальной папке:

private async void Test(string temp, CloudBlobContainer container, string target, string prefix) {
   foreach (var item in container.ListBlobs(prefix)) {
      switch (item) {
         case CloudBlobDirectory directory:
            Directory.CreateDirectory(Path.Combine(temp, directory.Prefix));
            Test(Path.Combine(temp, directory.Prefix), container, target, directory.Prefix);
            break;
      }
   }
   await CopyAll(temp, target, controller); /* Just a function to call at the end of the method*/
}

Наличие контейнера с этой виртуальной структурой:

container
   A/
   B/
   one.txt
   two.txt
   ...

Я хочу скопировать та же структура в локальной папке. Проблема в том, что B пропускается , и foreach рассматривается только A, но если я заменю Test(Path.Combine(temp, directory.Prefix), container, target, directory.Prefix), например, System.Diagnostics.Debug.WriteLine(directory.Prefix), чтобы просто напечатать их, то B печатается на приставка. Очевидно, что есть проблема с рекурсией, но я не могу ее увидеть. Я использую рекурсию для перебора виртуальных каталогов в контейнере, чтобы исходная структура реплицировалась в локальную папку.

1 Ответ

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

Вы должны вставить готовый код, мы не знаем детали этих функций, таких как Test() / CopyAll() в вашем сообщении.

Но если вы хотите загрузить все BLOB-объекты (включая папок) и сохраняя ту же структуру в локальном, вы можете попробовать код ниже:

 var conn_str = "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net";
 var myContainer = "aaa";

 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(conn_str);
 CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
 CloudBlobContainer blobContainer = blobClient.GetContainerReference(myContainer);

 var blobs = blobContainer.ListBlobs(prefix:null,useFlatBlobListing:true);


 foreach (var item in blobs)
 {
    switch (item) {
        case CloudBlockBlob blob:
            var filename = blob.Uri.Segments.Last();

            //download the blobs which directly under the container
            if (string.IsNullOrEmpty(blob.Parent.Prefix))
            {
                blob.DownloadToFile(@"d:\aaa" + "\\" + filename, FileMode.CreateNew);
            }
            else
            {
                //download the blobs which are inside folder
                string a = Path.Combine(@"d:\aaa", blob.Parent.Prefix);

                var mydiretory = Directory.CreateDirectory(a);
                blob.DownloadToFile(mydiretory.FullName + filename, FileMode.CreateNew);
            }
            break;
        default:
            break;
    }
}

Я использую этот пакет nuget Microsoft. Azure .Storage.Blob, версия 11.1. 3 .

Пожалуйста, дайте мне знать, если у вас все еще есть проблемы по этому поводу.

...