簡體   English   中英

Azure 存儲將 blob 移動到其他容器

[英]Azure Storage move blob to other container

我正在尋找一種將 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM