sha*_*oth 2 .net c# azure-storage azure-storage-blobs azure-sdk-.net
早期版本的Azure SDK具有CloudBlob.CopyFromBlob()同步性,我们在代码中使用它们.我们现在需要转移到SDK 2.4并且那里没有这样的方法,而是CloudBlockBlob.StartCopyFromBlob()返回一些魔术令牌,我们可以使用它来检查副本是如何完成的.
在我们的代码中"blob"的"背景"复制是没有意义的 - 同步执行复制会很好,所以以某种方式CopyFromBlob()使用较新的SDK中的东西实现等效的旧版本会很好.
这是我的方法:
CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(sourcePath);
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(targetPath);
var copyToken = targetBlob.StartCopyFromBlob(sourceBlob.Uri);
while( true ) {
System.Threading.Thread.Sleep(100);
CloudBlockBlob target = targetContainer.GetBlockBlobReference(targetPath);
bool greatSuccess = false;
switch( target.CopyState.Status ) {
case CopyStatus.Success:
greatSuccess = true;
break;
case CopyStatus.Pending:
continue;
default:
throw new Exception( "Failed to copy" );
}
if( success ) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
它看起来很有效,但我不确定那里没有潜在的问题.
什么是惯用的方式使用StartCopyFromBlob(),然后等待复制完成?
小智 12
如果复制操作适用于同一存储帐户且类型相同(例如 - >阻止blob以阻止同一存储帐户中的blob复制),则复制是同步的,并且您可以预期在StartCopyFromBlob()返回时复制操作已完成.您还可以通过检查targetBlob.CopySate值来验证它是否成功.
CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(sourcePath);
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(targetPath);
var copyToken = targetBlob.StartCopyFromBlob(sourceBlob.Uri);
if(targetBlob.CopyState.Status == CopyStatus.Success)
{
// Copy completed successfully
}
Run Code Online (Sandbox Code Playgroud)
对于所有其他方案(跨存储帐户或甚至跨同一存储帐户中的类型),复制操作是异步的,并使用后台中的备用资源来执行.目前,服务没有提供SLA可以复制的速度.如果您希望在这些情况下保持一致的行为,最好的选择是让客户端自己复制 - 从源下载数据并上传到目标.