C# Azure存储将blob移动到其他容器
我正在寻找一种将Azure中的blob从一个容器移动到另一个容器的方法。我找到的唯一解决方案是使用Azure存储数据移动库,但这似乎适用于不同的帐户。我想将同一帐户中的blob移动到另一个容器。我没有使用C# Azure存储将blob移动到其他容器,c#,vb.net,azure,storage,C#,Vb.net,Azure,Storage,我正在寻找一种将Azure中的blob从一个容器移动到另一个容器的方法。我找到的唯一解决方案是使用Azure存储数据移动库,但这似乎适用于不同的帐户。我想将同一帐户中的blob移动到另一个容器。我没有使用Azure存储数据移动库,但我非常确定它也会在同一个存储帐户中工作 说到您的问题,由于Azure存储本机不支持Move操作,您可以通过调用Copy Blob然后调用Delete Blob来实现这一点。通常,复制操作是异步的,但是,当在同一存储帐户中复制一个blob时,它是一个同步操作,即复制是即
Azure存储数据移动库
,但我非常确定它也会在同一个存储帐户中工作
说到您的问题,由于Azure存储本机不支持Move
操作,您可以通过调用Copy Blob
然后调用Delete Blob
来实现这一点。通常,复制
操作是异步的,但是,当在同一存储帐户中复制一个blob时,它是一个同步操作,即复制是即时发生的。请参阅下面的示例代码,该代码仅用于此目的:
static void MoveBlobInSameStorageAccount()
{
var cred = new StorageCredentials(accountName, accountKey);
var account = new CloudStorageAccount(cred, true);
var client = account.CreateCloudBlobClient();
var sourceContainer = client.GetContainerReference("source-container-name");
var sourceBlob = sourceContainer.GetBlockBlobReference("blob-name");
var destinationContainer = client.GetContainerReference("destination-container-name");
var destinationBlob = destinationContainer.GetBlockBlobReference("blob-name");
destinationBlob.StartCopy(sourceBlob);
sourceBlob.Delete(DeleteSnapshotsOption.IncludeSnapshots);
}
但是,请记住,此代码仅用于移动同一存储帐户中的Blob。要跨存储帐户移动blob,您需要确保在删除源blob之前完成复制操作。以下是对我有效的方法(在发布@Deumber的better answer后编辑的答案):
公共异步任务移动(CloudBlockBlob srcBlob,CloudBlobContainer destContainer)
{
CloudBlockBlob destBlob;
if(srcBlob==null)
{
抛出新异常(“源blob不能为null”);
}
如果(!destContainer.Exists())
{
抛出新异常(“目标容器不存在”);
}
//将源blob复制到目标容器
string name=srcBlob.Uri.Segments.Last();
destBlob=destContainer.GetBlockBlobReference(名称);
等待destBlob.startCopySync(srcBlob);
//复制完成后删除源blob。
srcBlob.Delete();
返回destBlob;
}
此问题中接受的答案将把文件移动到服务器内存中,然后再次将其从内存上载到azure
更好的做法是将所有工作都放在Azure上
CloudBlobClient blobClient = StorageAccount.CreateCloudBlobClient();
CloudBlobContainer sourceContainer = blobClient.GetContainerReference(SourceContainer);
CloudBlobContainer targetContainer = blobClient.GetContainerReference(TargetContainer);
CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(fileToMove);
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(newFileName);
await targetBlob.StartCopyAsync(sourceBlob);
非常好,但是亲爱的读者,您需要
WIndowsAzure.Storage
nuget软件包。这会产生出入费吗?@LukkhaCoder如果它在同一个存储帐户中,您不会产生出入费。但是,您将承担与复制和删除操作相关的交易费用。@LukkhaCoder它将承担进入/退出和交易费用。而且,提供的代码是错误的,因为它没有等待复制完成,这可能会导致数据丢失,未来的读者不会注意:用户在编写上述注释后编辑了此答案,这些注释不再适用。正如复制选项中所述,不保证立即完成-。是否有办法将虚拟子目录复制为好?它似乎正在截断该结构,只是移动原始blob本身,而不是在另一端创建虚拟目录结构。@stamm528,我相信您必须先使用CloudBlobContainer.Exists()方法创建该结构,如果不存在,则创建。因此,您可以编辑此答案以获取目录结构的第三个参数。
CloudBlobClient blobClient = StorageAccount.CreateCloudBlobClient();
CloudBlobContainer sourceContainer = blobClient.GetContainerReference(SourceContainer);
CloudBlobContainer targetContainer = blobClient.GetContainerReference(TargetContainer);
CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(fileToMove);
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(newFileName);
await targetBlob.StartCopyAsync(sourceBlob);