如何复制Azure容器和Blob

我试图将所有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&copy方法的列表targetBlob.StartCopyFromBlob(thisBlobUri);

但是副本实际上并没有发生。 任何的想法?

PS我正在使用Azure Storage SDK 4.3和目标存储是开发存储。

编辑2:

对于远程azure存储副本上面的代码工作正常。

但是对于模拟存储,我在尝试创建容器时遇到400 BadRequest错误:targetContainer.CreateIfNotExists();

我的模拟存储版本是3.0,似乎azure SDK和模拟器版本之间存在冲突。

哪个版本的存储客户端库适用于存储模拟器3.0?

您收到此错误的原因确实是因为版本不匹配。 如果我没有记错,Storage Emulator 3.0版使用REST API版本2013-08-15 ,因为最新版本的存储客户端库使用REST API版本2014-02-14 (参考: http : //msdn.microsoft.com/ en-us / library / azure / dn744252.aspx )。 您可以使用旧版本的存储客户端库。 您可以通过Nuget安装适当的版本。 例如,如果要安装Storage Client Library版本3.2.1,可以通过执行以下操作来执行此操作:

安装包WindowsAzure.Storage -Version 3.2.1(参考: http ://www.nuget.org/packages/WindowsAzure.Storage/3.2.1)

请尝试一下,看看是否能解决问题。

另外看一下你的代码,我也会推荐一些改变:

  • 我不建议将Blob Container的权限更改为Public 。 它会暴露您的blob存储并通过匿名访问使其可用。 我建议您在源blob上创建具有Read Permission SAS URL,并使用这些SAS URL进行复制。 由于blob副本是异步的,我建议保持SAS URL有效7天(为复制操作分配的最长时间)。
  • 我看到你在源blob和目标blob上都在做GetBlobReferenceFromServer 。 建议不要对源blob使用此方法,因为它实际上对您已通过列表获得的每个blob进行网络调用。 不建议在目标blob上使用,因为如果目标blob不存在,此方法将抛出Not Found (404)

相反,我建议您将列出的blob转换为适当的blob类型(Block或Page),然后获取SAS URL。 如果你知道你的所有blob都是块blob,你可以简单地将它们转换为CloudBlockBlob对象,而不必担心转换。

我不确定的一件事是如何复制页面blob。 在存储帐户之间进行复制时,页面blob会被复制为页面blob。 但是,我没有尝试从存储帐户复制到开发存储帐户。 但如果你没有页面blob,你不必担心它:)。