2016-10-26 21 views
8

MS AzureのBLOBをあるコンテナから別のコンテナに移動する方法を探しています。私が見つけた唯一の解決策はAzureストレージデータ移動ライブラリを使用することですが、これは異なるアカウント間で動作するようです。私は同じアカウント内のブロブを他のコンテナに移動したいと思います。Azureストレージが他のコンテナにBLOBを移動する

答えて

2

は(答え@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; 
    } 
+2

ダウンロードとアップロードの間で 'MemoryStream'の位置をリセットする必要があります。そうしないと空のファイルになります: ' memoryStream.Position = 0; ' –

+1

これはブロブストアからファイルをダウンロードし、ブロブストアにアップロードし直してください。下の回答に記載されているように、ストレージサービスにコピーを処理させるほうがずっと良いです。 – dana

+1

今後の読者への注意:上記のコメントが書かれており、それらはもはや適用されないため、ユーザーはこの回答を編集しました。 –

15

私はAzure Storage Data Movement Libraryを使用していないが、私はそれが同様に同じストレージアカウントで動作することをかなり確信しています。 Move操作がネイティブに何ができるかAzureストレージでサポートされていないため、あなたの質問に来

Delete Blob続いCopy Blobを呼び出すことによってこれを実装です。一般に、Copy操作は非同期ですが、ブロブが同じストレージアカウントにコピーされている場合、同期操作です。つまり、コピーは瞬時に実行されます。

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を削除する前にコピー操作が完了していることを確認する必要があります。ここで

+1

感謝を紺碧のために仕事をさせる方が良いでしょう。私はそれが仕事を持っている。 – Aprilia1982

+0

偉大な、しかし親愛なる読者、あなたは 'WIndowsAzure.Storage'ナゲットパッケージが必要です。 –

+0

これは出入り料金がかかりますか? –

10

この質問に受け入れられた答えは、サーバーのメモリにファイルを移動し、再度、ファイルをアップロードします紺碧に

それは

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); 
関連する問題