2016-04-13 5 views
2

あるストレージアカウントから別のストレージアカウントにBLOBをコピーしようとしています(別の場所)。ストレージアカウント間のBLOBをコピーする

私は、次のコードを使用しています:

var sourceContainer = sourceClient.GetContainerReference(containerId); 
var sourceBlob = sourceContainer.GetBlockBlobReference(blobId); 
if (await sourceBlob.ExistsAsync().ConfigureAwait(false)) 
{ 
    var targetContainer = targetClient.GetContainerReference(containerId); 
    await targetContainer.CreateIfNotExistsAsync().ConfigureAwait(false); 
    var targetBlob = targetContainer.GetBlockBlobReference(blobId); 
    await targetBlob.DeleteIfExistsAsync().ConfigureAwait(false); 
    await targetBlob.StartCopyAsync(sourceBlob).ConfigureAwait(false); 
} 

を、私は「見つかりません」エラーが発生します。 私はソースBLOBが実際に存在することを知っています。 間違ったコマンドを使用していますか?ストレージアカウント間のコピーに関する不足していることはありますか?

+0

完全なエラーメッセージを提供してください –

+2

リモートサーバーからエラーが返されました。(404)が見つかりません。 ---指定されたリソースは存在しません。 – shlatchz

答えて

2

コードを再生した後、私は答えに達しました。 ストレージアカウント間のコピーは、ソースblobがuriであり、blob参照でない場合にのみ可能です。 次のコードは、働いていた:

var sourceContainer = sourceClient.GetContainerReference(containerId); 
var sourceBlob = sourceContainer.GetBlockBlobReference(blobId); 
// Create a policy for reading the blob. 
var policy = new SharedAccessBlobPolicy 
{ 
    Permissions = SharedAccessBlobPermissions.Read, 
    SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-15), 
    SharedAccessExpiryTime = DateTime.UtcNow.AddDays(7) 
}; 
// Get SAS of that policy. 
var sourceBlobToken = sourceBlob.GetSharedAccessSignature(policy); 
// Make a full uri with the sas for the blob. 
var sourceBlobSAS = string.Format("{0}{1}", sourceBlob.Uri, sourceBlobToken); 
var targetContainer = targetClient.GetContainerReference(containerId); 
await targetContainer.CreateIfNotExistsAsync().ConfigureAwait(false); 
var targetBlob = targetContainer.GetBlockBlobReference(blobId); 
await targetBlob.DeleteIfExistsAsync().ConfigureAwait(false); 
await targetBlob.StartCopyAsync(new Uri(sourceBlobSAS)).ConfigureAwait(false); 

は、それが将来的に誰かを助けることを願っています。

+1

もう一つの選択肢は、Azureストレージデータ移動ライブラリfor .NETを使用することです。これは、AzCopyの基礎となるライブラリです。 ここで発表を見てください:https://azure.microsoft.com/en-us/blog/announcing-azure-storage-data-movement-library-0-2-0/ また役に立つサンプルアプリケーションはこちら:https://github.com/Azure/azure-storage-net-data-movement/tree/master/samples/DataMovementSamples (AzCopyに慣れていない場合は、https:// azure.microsoft.com/en-us/documentation/articles/storage-use-azcopy/) –

+2

@ TamraMyers-Microsoft標準のMicrosoft.WindowsAzure.Storageライブラリを使用するより効率的ですか?それとも、どちらも合法ですか? – shlatchz

+1

あなたのコードで使用されているStartCopyAsyncの場合、DataMovement Libraryはサーバー側のコピーであるため、効率的ではありません。しかし、ブロブ間でダウンロード、アップロード、または同期コピー(メモリへのダウンロードとアップロード)、AzCopyおよびDataMovement Library複数のスレッドで転送を行っているので、Microsoft.WindowsAzure.Storageライブラリよりも効率的です。 –

関連する問題