ListBlobs()仅看到Azure blob容器中的第一个文件夹

问题描述 投票:0回答:1

我的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将被打印到控制台。显然递归存在问题,但是我看不到它。我使用递归遍历容器中的虚拟目录,以便将原始结构复制到本地文件夹中。

c# recursion azure-storage-blobs
1个回答
0
投票

您应该粘贴完整的代码,我们在您的帖子中不知道这些功能的详细信息,例如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, version 11.1.3

[如果您还有其他问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.