将文件从一个Azure存储帐户复制到另一个

时间:2018-11-15 06:45:31

标签: c# azure azure-storage azure-storage-blobs azure-blob-storage

我正在尝试使用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)找不到。'

我在这里想念什么?

请注意,如果我尝试将文件从一个容器复制到相同存储帐户中,则同一代码可以完美地工作。

3 个答案:

答案 0 :(得分:2)

请看以下示例,说明如何执行复制(取自Introducing Asynchronous Cross-Account Copy 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));
    }
}

希望有帮助!

答案 1 :(得分:0)

这是使用--pre方法进行此操作的另一种方式

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下。要获取参考,请在nuget Manager中安装Microsoft.WindowsAzure.Storage.DataMovement

答案 2 :(得分:0)

我最近在尝试在单个Blob帐户中从/ uploads复制到/ raw时遇到了此错误。

问题是容器/ raw在测试环境中的目标端不存在。

(即,此错误实际上是由目标而不是源引发的)