【问题标题】:How do I iterate CloudBlobDirectory to copy the data?如何迭代 CloudBlobDirectory 来复制数据?
【发布时间】:2020-08-30 18:55:06
【问题描述】:

我编写了下面的代码来遍历 Gen2 存储 blob

 CloudStorageAccount sourceAccount = CloudStorageAccount.Parse(sourceConnection);
 CloudStorageAccount destAccount = CloudStorageAccount.Parse(destConnection);
 CloudBlobClient sourceClient = sourceAccount.CreateCloudBlobClient();
 CloudBlobClient destClient = destAccount.CreateCloudBlobClient();
 CloudBlobContainer sourceBlobContainer = sourceClient.GetContainerReference(sourceContainer);

 // Find all blobs that haven't changed since the specified date and time
 IEnumerable<ICloudBlob> sourceBlobRefs = FindMatchingBlobsAsync(sourceBlobContainer, transferBlobsNotModifiedSince).Result;



    private static async Task<IEnumerable<ICloudBlob>> FindMatchingBlobsAsync(CloudBlobContainer blobContainer, DateTime transferBlobsNotModifiedSince)
    {
        List<ICloudBlob> blobList = new List<ICloudBlob>();
        BlobContinuationToken token = null;

        // Iterate through the blobs in the source container
        do
        {
            BlobResultSegment segment = await blobContainer.ListBlobsSegmentedAsync(prefix: "", currentToken: token);
            foreach (CloudBlobDirectory VARIABLE in segment.Results)
            {
                BlobResultSegment segment2 = await VARIABLE.ListBlobsSegmentedAsync(currentToken: token);
                foreach (CloudBlobDirectory VARIABLE2 in segment2.Results)//Bad coding
                {
                    //how do I get children count ?
                }
            }

        }while (token != null);
     }

这将只迭代 2 个级别,但不会动态地迭代到内部级别。我在下面的层次结构中有 blob

  --Container
    --FolderA
      --FolderAA
        --FolderAA1
          --File1.txt
          --File2.txt              
        --FolderAA2
          --File1.txt
          --File2.txt
        --FolderAA3
     --FolderAB
       --File8.txt
     --FolderAC
       --File9.txt

这个层次结构是动态的

如何循环和复制 blob 内容。

注意:我不想使用CLI 命令来复制。因为一旦复制开始,我将无法控制。

更新

在这里找到了一些示例:https://csharp.hotexamples.com/examples/Microsoft.WindowsAzure.Storage.Blob/CloudBlobContainer/ListBlobsSegmented/php-cloudblobcontainer-listblobssegmented-method-examples.html

【问题讨论】:

  • 您使用的是什么版本的 Storage .Net SDK?
  • 我的版本 2.1.0
  • 真的很老了:)。让我提供一个使用 SDK 版本 9.3.3 的解决方案。它们或多或少应该是兼容的。
  • 实际上我找到了很久以前写的答案。关闭这个作为那个的副本。请看一下,如果这不能解决您的问题,请要求重新打开。 HTH。
  • 添加了列出 Blob 容器中所有 Blob 的示例代码。

标签: c# azure blob


【解决方案1】:

请看下面的示例代码:

class Program
{
    static void Main(string[] args)
    {
        var storageAccount = CloudStorageAccount.Parse("UseDevelopmentStorage=true");
        var client = storageAccount.CreateCloudBlobClient();
        var container = client.GetContainerReference("test");
        var blobs = FindMatchingBlobsAsync(container).GetAwaiter().GetResult();
        foreach (var blob in blobs)
        {
            Console.WriteLine(blob.Name);
        }
        Console.WriteLine("-------------------------------------");
        Console.WriteLine("List of all blobs fetched. Press any key to terminate the application.");
        Console.ReadKey();
    }

    private static async Task<IEnumerable<ICloudBlob>> FindMatchingBlobsAsync(CloudBlobContainer blobContainer)
    {
        List<ICloudBlob> blobList = new List<ICloudBlob>();
        BlobContinuationToken token = null;

        // Iterate through the blobs in the source container
        do
        {
            BlobResultSegment segment = await blobContainer.ListBlobsSegmentedAsync(prefix: "", useFlatBlobListing: true, BlobListingDetails.None, 5000, token, new BlobRequestOptions(), new OperationContext());
            token = segment.ContinuationToken;
            foreach(var item in segment.Results)
            {
                blobList.Add((ICloudBlob)item);
            }
        } while (token != null);
        return blobList;
    }
}

【讨论】:

    猜你喜欢
    • 2018-10-02
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2020-04-10
    • 2017-03-29
    相关资源
    最近更新 更多