如何在只有 StartCopyFromBlob() 的 Azure SDK 中实现单个 blob 的同步复制?
How do I implement synchronous copying of a single blob in Azure SDK that only has StartCopyFromBlob()?
早期版本的 Azure SDK 有 CloudBlob.CopyFromBlob()
,它是同步的,我们在代码中使用它。我们现在需要转移到 SDK 2.4,那里没有这样的方法,取而代之的是 CloudBlockBlob.StartCopyFromBlob()
returns 一些我们可以用来检查复制是如何完成的魔法标记。
在我们的代码中 "background" 复制 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;
}
}
它看起来工作正常,但我不确定其中是否存在潜在问题。
使用 StartCopyFromBlob()
然后等待复制完成的惯用方法是什么?
如果复制操作针对同一存储帐户和同一类型(示例 -> 块 blob 到块 blob 在同一存储帐户中复制),复制是同步的,您可以预期复制操作已完成StartCopyFromBlob() returns。您还可以通过检查 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
}
对于所有其他场景(跨存储帐户甚至同一存储帐户内的不同类型)复制操作是异步的,并使用后台的备用资源来执行。目前,服务没有提供关于复制速度的 SLA。如果您希望在这些情况下保持一致的行为,最好的选择是让客户端自己复制 - 从源下载数据并上传到目标。
早期版本的 Azure SDK 有 CloudBlob.CopyFromBlob()
,它是同步的,我们在代码中使用它。我们现在需要转移到 SDK 2.4,那里没有这样的方法,取而代之的是 CloudBlockBlob.StartCopyFromBlob()
returns 一些我们可以用来检查复制是如何完成的魔法标记。
在我们的代码中 "background" 复制 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;
}
}
它看起来工作正常,但我不确定其中是否存在潜在问题。
使用 StartCopyFromBlob()
然后等待复制完成的惯用方法是什么?
如果复制操作针对同一存储帐户和同一类型(示例 -> 块 blob 到块 blob 在同一存储帐户中复制),复制是同步的,您可以预期复制操作已完成StartCopyFromBlob() returns。您还可以通过检查 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
}
对于所有其他场景(跨存储帐户甚至同一存储帐户内的不同类型)复制操作是异步的,并使用后台的备用资源来执行。目前,服务没有提供关于复制速度的 SLA。如果您希望在这些情况下保持一致的行为,最好的选择是让客户端自己复制 - 从源下载数据并上传到目标。