簡體   English   中英

將文件從一個Azure存儲帳戶復制到另一個

[英]Copy file from one Azure storage account to another

我正在嘗試使用StartCopy方法將文件從一個存儲帳戶復制到另一個帳戶,以復制文件。 檢查以下代碼。

CloudStorageAccount sourceStorageAccount = CloudStorageAccount.Parse(@"source storage account connection string");
CloudStorageAccount destStorageAccount = CloudStorageAccount.Parse(@"destination storage account connection string");

CloudBlobClient sourceBlobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobClient destBlobClient = destStorageAccount.CreateCloudBlobClient();
var sourceContainer = sourceBlobClient.GetContainerReference("sourceContainer");
var destContainer = destBlobClient.GetContainerReference("destContainer");

CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference("copy.txt");
CloudBlockBlob targetBlob = destContainer.GetBlockBlobReference("copy.txt");

targetBlob.StartCopy(sourceBlob);

但是它總是返回以下錯誤。

Microsoft.WindowsAzure.Storage.StorageException:遠程服務器返回錯誤:(404)未找到。

我在這里想念什么?

請注意,如果我嘗試將文件從一個容器復制到同一存儲帳戶中的另一個容器,則相同的代碼可以完美地工作。

請看以下示例,了解如何執行復制(摘自異步跨帳戶復制Blob介紹 ):

public static void CopyBlobs(
            CloudBlobContainer srcContainer,  
            string policyId, 
            CloudBlobContainer destContainer)
{
    // get the SAS token to use for all blobs
    string blobToken = srcContainer.GetSharedAccessSignature(
                   new SharedAccessBlobPolicy(), policyId);


    var srcBlobList = srcContainer.ListBlobs(true, BlobListingDetails.None);
    foreach (var src in srcBlobList)
    {
        var srcBlob = src as CloudBlob;

        // Create appropriate destination blob type to match the source blob
        CloudBlob destBlob;
        if (srcBlob.Properties.BlobType == BlobType.BlockBlob)
        {
            destBlob = destContainer.GetBlockBlobReference(srcBlob.Name);
        }
        else
        {
            destBlob = destContainer.GetPageBlobReference(srcBlob.Name);
        }

        // copy using src blob as SAS
        destBlob.StartCopyFromBlob(new Uri(srcBlob.Uri.AbsoluteUri + blobToken));
    }
}

希望能幫助到你!

這是使用TransferManager.CopyAsync方法執行此操作的另一種方法

CloudStorageAccount sourceStorageAccount = CloudStorageAccount.Parse(@"source storage account connection string");
CloudStorageAccount destStorageAccount = CloudStorageAccount.Parse(@"destination storage account connection string");

CloudBlobClient sourceBlobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobClient destBlobClient = destStorageAccount.CreateCloudBlobClient();
var sourceContainer = sourceBlobClient.GetContainerReference("sourceContainer");
var destContainer = destBlobClient.GetContainerReference("destContainer");

CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference("copy.txt");
CloudBlockBlob targetBlob = destContainer.GetBlockBlobReference("copy.txt");

TransferManager.CopyAsync(sourceBlob, targetBlob, true).Wait();

TransferManager在名稱空間Microsoft.WindowsAzure.Storage.DataMovement 要獲取參考,請在nuget管理器中安裝Microsoft.Azure.Storage.DataMovement

我最近在嘗試在單個Blob帳戶中從/ uploads復制到/ raw時遇到此錯誤。

問題是容器/ raw在測試環境中的目標端不存在。

(即,此錯誤實際上是由目標而不是源引發的)

暫無
暫無

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

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