Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure存储将blob移动到其他容器_C#_Vb.net_Azure_Storage - Fatal编程技术网

C# 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中的blob从一个容器移动到另一个容器的方法。我找到的唯一解决方案是使用Azure存储数据移动库,但这似乎适用于不同的帐户。我想将同一帐户中的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);