Menyalin blob dengan pustaka klien Azure Storage

Artikel ini menunjukkan cara menyalin blob di akun Azure Storage. Ini juga menunjukkan cara membatalkan operasi salinan asinkron. Kode contoh menggunakan pustaka klien Azure Storage.

Tentang menyalin blob

Saat Anda menyalin blob dalam akun penyimpanan yang sama, itu adalah operasi sinkron. Saat Anda menyalin di seluruh akun, itu adalah operasi asinkron.

Blob sumber untuk operasi salinan mungkin adalah blob blok, blob pelengkap, blob halaman, atau snapshot. Jika blob tujuan sudah ada, itu harus berasal dari jenis blob yang sama dengan blob sumber. Blob tujuan yang ada akan ditimpa.

Blob tujuan tidak dapat dimodifikasi saat operasi salin sedang berlangsung. Blob tujuan hanya dapat memiliki satu operasi salinan yang luar biasa. Dengan kata lain, blob tidak dapat menjadi tujuan untuk beberapa operasi salinan yang tertunda.

Keseluruhan blob sumber atau file selalu disalin. Menyalin rentang byte atau sekumpulan blok tidak didukung.

Ketika blob disalin, properti sistem disalin ke blob tujuan dengan nilai yang sama.

Operasi salin dapat mengambil salah satu formulir berikut:

  • Salin blob sumber ke blob tujuan dengan nama yang berbeda. Blob tujuan dapat menjadi blob yang ada dengan jenis blob yang sama (blok, tambahkan, atau halaman), atau dapat menjadi blob baru yang dibuat oleh operasi salin.
  • Menyalin blob sumber ke blob tujuan dengan nama yang sama, akan secara efektif mengganti blob tujuan. Operasi salinan seperti itu menghapus blok yang tidak dikomit dan menimpa metadata blob tujuan.
  • Salin file sumber dalam layanan File Azure ke blob tujuan. Blob tujuan bisa menjadi blob blok yang ada, atau bisa menjadi blob blok baru yang dibuat oleh operasi salin. Menyalin dari file ke blb halaman atau blob penambahan tidak didukung.
  • Salin snapshot di atas blob dasarnya. Dengan mempromosikan snapshot ke posisi blob dasar, Anda dapat memulihkan versi blob yang lebih lama.
  • Salin blob sumber ke blob tujuan dengan nama yang berbeda. Blob tujuan yang dihasilkan adalah blob yang dapat ditulis dan bukan snapshot.

Menyalin blob

Untuk menyalin blob, panggil salah satu metode berikut:

Metode StartCopyFromUri dan StartCopyFromUriAsync mengembalikan objek CopyFromUriOperation yang berisi informasi tentang operasi salin.

Contoh kode berikut mendapatkan BlobClient yang mewakili blob yang dibuat sebelumnya dan menyalinnya ke blob baru dalam wadah yang sama:

private static async Task CopyBlobAsync(BlobContainerClient container)
{
    try
    {
        // Get the name of the first blob in the container to use as the source.
        string blobName = container.GetBlobs().FirstOrDefault().Name;

        // Create a BlobClient representing the source blob to copy.
        BlobClient sourceBlob = container.GetBlobClient(blobName);

        // Ensure that the source blob exists.
        if (await sourceBlob.ExistsAsync())
        {
            // Lease the source blob for the copy operation 
            // to prevent another client from modifying it.
            BlobLeaseClient lease = sourceBlob.GetBlobLeaseClient();

            // Specifying -1 for the lease interval creates an infinite lease.
            await lease.AcquireAsync(TimeSpan.FromSeconds(-1));

            // Get the source blob's properties and display the lease state.
            BlobProperties sourceProperties = await sourceBlob.GetPropertiesAsync();
            Console.WriteLine($"Lease state: {sourceProperties.LeaseState}");

            // Get a BlobClient representing the destination blob with a unique name.
            BlobClient destBlob = 
                container.GetBlobClient(Guid.NewGuid() + "-" + sourceBlob.Name);

            // Start the copy operation.
            await destBlob.StartCopyFromUriAsync(sourceBlob.Uri);

            // Get the destination blob's properties and display the copy status.
            BlobProperties destProperties = await destBlob.GetPropertiesAsync();

            Console.WriteLine($"Copy status: {destProperties.CopyStatus}");
            Console.WriteLine($"Copy progress: {destProperties.CopyProgress}");
            Console.WriteLine($"Completion time: {destProperties.CopyCompletedOn}");
            Console.WriteLine($"Total bytes: {destProperties.ContentLength}");

            // Update the source blob's properties.
            sourceProperties = await sourceBlob.GetPropertiesAsync();

            if (sourceProperties.LeaseState == LeaseState.Leased)
            {
                // Break the lease on the source blob.
                await lease.BreakAsync();

                // Update the source blob's properties to check the lease state.
                sourceProperties = await sourceBlob.GetPropertiesAsync();
                Console.WriteLine($"Lease state: {sourceProperties.LeaseState}");
            }
        }
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine(ex.Message);
        Console.ReadLine();
        throw;
    }
}

Membatalkan operasi salin

Membatalkan operasi salin akan menghasilkan blob tujuan dengan panjang nol. Namun, metadata untuk blob tujuan akan memiliki nilai baru yang disalin dari blob sumber atau diatur secara eksplisit selama operasi salin. Untuk menjaga metadata asli dari sebelum salinan, buat snapshot dari blob tujuan sebelum memanggil salah satu metode salin.

Periksa properti BlobProperties.CopyStatus pada blob tujuan untuk mendapatkan status operasi salin. Blob terakhir akan dilakukan ketika salinan selesai.

Saat Anda membatalkan operasi salin, status salinan blob tujuan diatur ke CopyStatus.Aborted.

Metode AbortCopyFromUri dan AbortCopyFromUriAsync membatalkan operasi salinan yang sedang berlangsung.

// Get the destination blob's properties to check the copy status.
BlobProperties destProperties = destBlob.GetProperties();

// Check the copy status. If the status is pending, abort the copy operation.
if (destProperties.CopyStatus == CopyStatus.Pending)
{
    await destBlob.AbortCopyFromUriAsync(destProperties.CopyId);
    Console.WriteLine($"Copy operation {destProperties.CopyId} has been aborted.");
}

Azure SDK

Dapatkan informasi selengkapnya tentang Azure SDK:

Langkah berikutnya

Topik berikut berisi informasi tentang menyalin blob dan membatalkan operasi salinan yang sedang berlangsung dengan menggunakan API Azure REST.