【问题标题】:Azure Storage move blob to other containerAzure 存储将 blob 移动到其他容器
【发布时间】:2020-12-01 08:59:54
【问题描述】:

我正在寻找一种将 Azure 中的 blob 从一个容器移动到另一个容器的方法。我找到的唯一解决方案是使用 Azure 存储数据移动库,但这似乎适用于不同的帐户。我想将同一帐户中的 blob 移动到其他容器。

【问题讨论】:

    标签: c# vb.net azure storage


    【解决方案1】:

    我没有使用过Azure Storage Data Movement Library,但我很确定它也可以在同一个存储帐户中使用。

    关于您的问题,由于 Azure 存储本身不支持 Move 操作,因此您可以通过调用 Copy Blob 后跟 Delete Blob 来实现这一点。通常Copy 操作是异步的,但是当在同一个存储帐户中复制 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 之前完成复制操作。

    【讨论】:

    • 效果很好,但亲爱的读者,您需要WIndowsAzure.Storage nuget 包。
    • 这会产生出站和/或入站费用吗?
    • @LukkhaCoder 如果它在同一个存储帐户中,您将不会产生入口/出口费用。但是,您会产生与复制和删除操作相关的交易费用。
    • @LukkhaCoder 它将产生入口/出口和交易费用。此外,提供的代码是错误的,因为它没有等待复制完成,这可能会导致数据丢失
    • @lerthe61 如果操作在同一个存储帐户中,则该操作是同步且即时的,这是答案中提到的警告。
    【解决方案2】:

    这对我有用(在@Deumber 发布更好的答案后编辑了答案):

        public async Task<CloudBlockBlob> Move(CloudBlockBlob srcBlob, CloudBlobContainer destContainer)
        {
            CloudBlockBlob destBlob;
    
            if (srcBlob == null)
            {
                throw new Exception("Source blob cannot be null.");
            }
    
            if (!destContainer.Exists())
            {
                throw new Exception("Destination container does not exist.");
            }
    
            //Copy source blob to destination container
            string name = srcBlob.Uri.Segments.Last();
            destBlob = destContainer.GetBlockBlobReference(name);
            await destBlob.StartCopyAsync(srcBlob);
            //remove source blob after copy is done.
            srcBlob.Delete();
            return destBlob;
        }
    

    【讨论】:

    • 未来读者请注意:自上述 cmets 编写以来,用户已编辑此答案,它们不再适用。
    • Gaurav's answer 中所述,不能保证立即完成复制选项 - "the Blob service copies blobs on a best-effort basis"
    • 有没有办法让虚拟子目录也被复制过来?它似乎正在截断它,只是移动原始 blob 本身,而不是在另一端创建虚拟目录结构。
    • @stamm528,我相信你之前必须创建结构,使用 CloudBlobContainer.Exists() 方法,如果不存在,创建。因此,您可以编辑此答案以获取目录结构的第三个参数。
    【解决方案3】:

    此问题中接受的答案会将文件移动到您的服务器内存中,然后将其从您的内存中再次上传到 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);
    

    【讨论】:

      猜你喜欢
      • 2023-01-31
      • 2016-02-17
      • 2012-06-25
      • 2021-10-08
      • 2017-08-18
      • 2018-09-25
      • 2021-11-28
      • 2023-03-14
      • 2021-07-27
      相关资源
      最近更新 更多