[英]How to Copy Azure Containers & Blobs
我正在尝试将所有Blob复制到不同的存储中:
CloudBlobClient srcblobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobClient targetBlobClient = targetStorageAccount.CreateCloudBlobClient();
foreach (CloudBlobContainer cont in srcblobClient.ListContainers())
{
foreach (IListBlobItem srcBlob in cont.ListBlobs(useFlatBlobListing: true))
{
var targetContainer = targetBlobClient.GetContainerReference(cont.Name);
targetContainer.CreateIfNotExists();
Uri thisBlobUri = srcBlob.Uri;
var serverBlob = srcblobClient.GetBlobReferenceFromServer(thisBlobUri);
ICloudBlob targetBlob = targetContainer.GetBlobReferenceFromServer(serverBlob.Name);
targetBlob.StartCopyFromBlob(thisBlobUri);
}
}
我能够看到blob列表和复制方法正在被调用targetBlob.StartCopyFromBlob(thisBlobUri);
但是,复制实际上并没有发生。 任何想法?
PS我正在使用Azure存储SDK 4.3,目标存储是开发存储。
编辑2:
对于远程天蓝色存储,复制上面的代码可以正常工作。
但是对于模拟存储,尝试创建容器时出现400 BadRequest错误:targetContainer.CreateIfNotExists();
我的仿真存储版本是3.0,似乎azure SDK和仿真器版本之间存在冲突。
哪个版本的存储客户端库可以与存储模拟器3.0一起很好地工作?
您收到此错误的原因确实是由于版本不匹配。 如果我没记错的话,Storage Emulator 3.0版将使用REST API版本2013-08-15
,其中最新版本的存储客户端库将使用REST API版本2014-02-14
(Ref: http : //msdn.microsoft.com/ zh-CN / library / azure / dn744252.aspx )。 您可能会利用旧版本的存储客户端库。 您可以通过Nuget安装适当的版本。 例如,如果要安装Storage Client Library版本3.2.1,则可以执行以下操作:
安装包WindowsAzure.Storage-版本3.2.1(参考: http ://www.nuget.org/packages/WindowsAzure.Storage/3.2.1)
请尝试一下,看看是否可以解决问题。
在查看您的代码时,我还建议一些更改:
Public
。 它公开了您的Blob存储并通过匿名访问使其可用。 我建议您在源Blob上创建具有Read Permission
SAS URL,并使用这些SAS URL复制。 由于Blob复制是异步的,因此我建议保持SAS URL有效7天(为复制操作分配的最大时间)。 GetBlobReferenceFromServer
。 不建议对源Blob使用此方法,因为它实际上会进行网络调用,因此对于您已经通过列表获得的每个Blob。 不建议在目标Blob上使用,因为如果目标Blob不存在,则此方法将抛出Not Found (404)
。 相反,我建议您将通过列表获得的Blob转换为适当的Blob类型(块或页面),然后获取SAS URL。 如果您知道所有Blob都是块Blob,则只需将它们强制转换为CloudBlockBlob对象,而不必担心强制转换。
我不确定的一件事是如何复制页面Blob。 在存储帐户之间进行复制时,页面Blob将作为页面Blob复制。 但是,我还没有尝试从存储帐户复制到开发存储帐户。 但是,如果您没有页面Blob,则不必担心:)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.