如何在一次交易中移动多个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从源容器移动到目标容器?
答案 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);
}
}
}