Azure存储将blob移动到其他容器

本文关键字:其他 移动 存储 blob Azure | 更新日期: 2023-09-27 18:15:04

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

Azure存储将blob移动到其他容器

我没有使用Azure Storage Data Movement Library,但我很确定它也会在相同的存储帐户中工作。

回答你的问题,由于Azure存储不支持Move操作,你可以做的是通过调用Copy BlobDelete 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之前,需要确保复制操作已经完成。

这是对我有用的(在@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;
    }

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