39

古い 1.7 ストレージ クライアントには CloudBlob.CopyFromBlob(otherBlob) メソッドがありましたが、2.0 バージョンには存在しないようです。BLOB をコピーするための推奨されるベスト プラクティスは何ですか? ICloudBlob.BeginStartCopyFromBlob メソッドが表示されます。それが適切な方法である場合、どのように使用しますか?

4

8 に答える 8

55

Gaurav Mantriは、バージョン 2.0 の Azure Storage に関する一連の記事を書いています。このコードは、ストレージ クライアント ライブラリ 2.0 – Migrating Blob Storage Code for Blob Copyのブログ投稿から抜粋したものです。

CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer sourceContainer = cloudBlobClient.GetContainerReference(containerName);
CloudBlobContainer targetContainer = cloudBlobClient.GetContainerReference(targetContainerName);
string blobName = "<Blob Name e.g. myblob.txt>";
CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(blobName);
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(blobName);
targetBlob.StartCopyFromBlob(sourceBlob);
于 2013-01-04T06:27:53.403 に答える
33

Storage 6.3 (元の質問よりもはるかに新しいライブラリ) を使用し、非同期メソッドは StartCopyAsync ( MSDN )を使用します

  CloudStorageAccount storageAccount = CloudStorageAccount.Parse("Your Connection");

  CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
  CloudBlobContainer container = blobClient.GetContainerReference("YourContainer");

  CloudBlockBlob source = container.GetBlockBlobReference("Your Blob");
  CloudBlockBlob target = container.GetBlockBlobReference("Your New Blob");
        
  await target.StartCopyAsync(source);
于 2016-02-22T22:45:07.087 に答える
19

参考までに、関数が存在しなくなっSDKたため、これの最新バージョン (7.x)では機能しなくなりました。BeginStartCopyBlob

次の方法で実行できます。

// this tunnels the data via your program,
// so it reuploads the blob instead of copying it on service side
using (var stream = await sourceBlob.OpenReadAsync())
{
  await destinationBlob.UploadFromStreamAsync(stream);
}

@(Alexey Shcherbak) が述べたように、これは続行するためのより良い方法です。

await targetCloudBlob.StartCopyAsync(sourceCloudBlob.Uri);

while (targetCloudBlob.CopyState.Status == CopyStatus.Pending)
{
    await Task.Delay(500);
    // Need to fetch or "CopyState" will never update
    await targetCloudBlob.FetchAttributesAsync(); 
}

if (targetCloudBlob.CopyState.Status != CopyStatus.Success)
{
    throw new Exception("Copy failed: " + targetCloudBlob.CopyState.Status);
}
于 2016-04-12T12:29:41.057 に答える
11

Naveen は、StartCopyFromBlob(同期メソッド) を使用するための正しい構文を既に説明しています。あなたが言及したメソッド ( ) は、たとえばBeginStartCopyFromBlobと組み合わせて使用​​できる非同期の代替手段です。Task

    var blobClient = account.CreateCloudBlobClient();

    // Upload picture.
    var picturesContainer = blobClient.GetContainerReference("pictures");
    picturesContainer.CreateIfNotExists();
    var myPictureBlob = picturesContainer.GetBlockBlobReference("me.png");
    using (var fs = new FileStream(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg", FileMode.Open))
        myPictureBlob.UploadFromStream(fs);

    // Backup picture.
    var backupContainer = blobClient.GetContainerReference("backup");
    backupContainer.CreateIfNotExists();
    var backupBlob = picturesContainer.GetBlockBlobReference("me.png");

    var task = Task.Factory.FromAsync<string>(backupBlob.BeginStartCopyFromBlob(myPictureBlob, null, null), backupBlob.EndStartCopyFromBlob);
    task.ContinueWith((t) =>
    {
        if (!t.IsFaulted)
        {
            while (true)
            {
                Console.WriteLine("Copy state for {0}: {1}", backupBlob.Uri, backupBlob.CopyState.Status);
                Thread.Sleep(500);
            }
        }
        else
        {
            Console.WriteLine("Error: " + t.Exception);
        }
    });
于 2013-01-04T06:59:09.663 に答える
4

以前の投稿が行われてから、API が少しクリーンアップされたようです。

// _client is a BlobServiceClient injected via DI in the constructor.

BlobContainerClient sourceContainerClient = _client.GetBlobContainerClient(sourceContainerName);
BlobClient sourceClient = sourceContainerClient.GetBlobClient(blobName);

BlobContainerClient destContainerClient = _client.GetBlobContainerClient(destContainerName);
BlobClient destClient = destContainerClient.GetBlobClient(blobName);

// assume that if the following doesn't throw an exception, then it is successful.
CopyFromUriOperation operation = await destClient.StartCopyFromUriAsync(sourceClient.Uri);
await operation.WaitForCompletionAsync();

のドキュメントにoperation.WaitForCompletionAsyncは次のように書かれています:

長時間実行オペレーションが完了するまで定期的にサーバーを呼び出します。このメソッドは、HasCompleted が true になるまで定期的に UpdateStatusAsync を呼び出し、操作の最終結果を返します。

このメソッドのソース コードを確認すると、 on エラーBlobBaseClient.GetPropertiesをスローする呼び出し (または非同期バージョン) のようです。RequestFailureException

于 2021-01-21T01:35:18.553 に答える