如何在一次交易中移动多个Blob?

时间:2019-07-15 19:39:08

标签: c# .net azure-functions azure-blob-storage

如何在一次交易中移动多个Blob?

我目前一次移动1个斑点,

    public static async Task MoveBlobInSameStorageAccount(string name, string from, string to, string connection)
    {
        CloudStorageAccount.TryParse(connection, out CloudStorageAccount storageAccount);
        var blobClient = storageAccount.CreateCloudBlobClient();
        var sourceContainer = blobClient.GetContainerReference(from);
        var sourceBlob = sourceContainer.GetBlockBlobReference(name);
        var destinationContainer = blobClient.GetContainerReference(to);
        var destinationBlob = destinationContainer.GetBlockBlobReference(name);
        await destinationBlob.StartCopyAsync(sourceBlob);
        await sourceBlob.DeleteAsync();
    }

但是,我需要能够一次移动5-10个Blob。

如何在一次交易中将多个blob从源容器移动到目标容器?

1 个答案:

答案 0 :(得分:2)

您可以使用Microsoft Azure Storage Data Movement Library。我最近在一个项目上使用了它,效果很好。

具体来说,您要使用:

  

CopyDirectoryAsync

GitHub repo中有一个示例文件夹,您可以参考。我不需要样本中的大多数代码,因此我进行了修改:

  

BlobDirectoryCopySample

我还使用了示例文件夹中的Utils类。您还可以设置ParallelOperations,它“获取或设置一个值,该值指示要同时处理的工作项数。”

namespace DataMovementSamples
{
    using System;
#if !DOTNET5_4
#endif
    using System.Threading.Tasks;
    using Microsoft.Azure.Storage.DataMovement;

    public class Program
    {
        public static async Task Main(string[] args)
        {
            try
            {
                Console.WriteLine();
                Console.WriteLine("Data movement directory copy sample.");
                await BlobDirectoryCopySample();
            }
            finally
            {
                Console.WriteLine();
                Console.WriteLine("Cleanup generated data.");
            }
        }

        private static async Task BlobDirectoryCopySample()
        {
            var sourceBlobDir = await Util.GetCloudBlobDirectoryAsync("sourcecontainer", "dir1");
            var destBlobDir = await Util.GetCloudBlobDirectoryAsync("targetcontainer", "dir2");

            var options = new CopyDirectoryOptions()
            {
                Recursive = true,
            };

            var context = new DirectoryTransferContext();
            context.FileTransferred += FileTransferredCallback;
            context.FileFailed += FileFailedCallback;
            context.FileSkipped += FileSkippedCallback;

            TransferManager.Configurations.ParallelOperations = 50;
            Console.WriteLine("Transfer started");

            try
            {
                Task task = TransferManager.CopyDirectoryAsync(sourceBlobDir, destBlobDir, false, options, context);
                await task;
            }
            catch (Exception e)
            {
                Console.WriteLine("The transfer is cancelled: {0}", e.Message);
            }

            Console.WriteLine("The transfer is completed.");
        }

        private static void FileTransferredCallback(object sender, TransferEventArgs e)
        {
            Console.WriteLine("Transfer Succeeds. {0} -> {1}.", e.Source, e.Destination);
        }

        private static void FileFailedCallback(object sender, TransferEventArgs e)
        {
            Console.WriteLine("Transfer fails. {0} -> {1}. Error message:{2}", e.Source, e.Destination, e.Exception.Message);
        }

        private static void FileSkippedCallback(object sender, TransferEventArgs e)
        {
            Console.WriteLine("Transfer skips. {0} -> {1}.", e.Source, e.Destination);
        }
    }
}