Azure Depolama istemci kitaplıklarına blob kopyalama

bu makalede, bir Azure Depolama hesabındaki bir blobun nasıl kopyalanacağı gösterilmektedir. Ayrıca, zaman uyumsuz bir kopyalama işleminin nasıl iptal alınacağını gösterir. örnek kod, Azure Depolama istemci kitaplıklarını kullanır.

Blob 'ları kopyalama hakkında

Aynı depolama hesabı içindeki bir blobu kopyaladığınızda, zaman uyumlu bir işlemdir. Hesaplar arasında kopyalama yaptığınızda zaman uyumsuz bir işlemdir.

Kopyalama işlemi için kaynak blobu bir Blok Blobu, bir ekleme blobu, Sayfa Blobu veya anlık görüntü olabilir. Hedef blobu zaten varsa, kaynak blobu ile aynı blob türünde olması gerekir. Var olan bir hedef Blobun üzerine yazılacak.

Hedef blobu, bir kopyalama işlemi sürerken değiştirilemez. Hedef Blobun yalnızca bir adet bekleyen kopyalama işlemi olabilir. Diğer bir deyişle, bir blob birden çok bekleyen kopyalama işlemi için hedef olamaz.

Tüm kaynak Blobu veya dosya her zaman kopyalanır. Bir dizi bayt veya blok kümesi kopyalama desteklenmez.

Blob kopyalandığında, sistem özellikleri hedef Blobun aynı değerlerle kopyalanır.

Kopyalama işlemi aşağıdaki formlardan herhangi birini gerçekleştirebilir:

  • Kaynak blobunu, farklı bir ada sahip bir hedef bloba kopyalayın. Hedef blobu aynı blob türünde (blok, ekleme veya sayfa) var olan bir BLOB olabilir veya kopyalama işlemi tarafından oluşturulan yeni bir BLOB olabilir.
  • Kaynak blobu, hedef blobu etkin bir şekilde değiştirerek aynı ada sahip bir hedef bloba kopyalayın. Bu tür bir kopyalama işlemi, kaydedilmemiş blokları kaldırır ve hedef Blobun meta verilerinin üzerine yazar.
  • Azure dosya hizmetindeki bir kaynak dosyayı hedef bloba kopyalayın. Hedef blobu varolan bir Blok Blobu olabilir veya kopyalama işlemi tarafından oluşturulan yeni bir Blok Blobu olabilir. Dosyalardan sayfa bloblarına veya ekleme bloblarına kopyalama desteklenmez.
  • Bir anlık görüntüyü temel blobunun üzerine kopyalayın. Bir anlık görüntüyü temel Blobun konumuna yükselterek bir blob 'un önceki bir sürümünü geri yükleyebilirsiniz.
  • Bir anlık görüntüyü hedef bloba farklı bir adla kopyalayın. Elde edilen hedef blobu anlık görüntü değil yazılabilir bir Blobun.

Blob kopyalama

Bir blobu kopyalamak için aşağıdaki yöntemlerden birini çağırın:

StartCopyFromUriVe StartCopyFromUriAsync yöntemleri kopyalama işlemi hakkında bilgi Içeren bir Copyfromurioperation nesnesi döndürür.

Aşağıdaki kod örneği, daha önce oluşturulmuş bir blobu temsil eden bir Blobclient alır ve onu aynı kapsayıcıda yeni bir bloba kopyalar:

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;
    }
}

Kopyalama işlemini iptal et

Bir kopyalama işleminin iptal edilmeden, sıfır uzunluğunda bir hedef Blobun sonucu oluşur. Ancak, hedef Blobun meta verileri, kaynak Blobun yeni değerleri kopyalayacak veya kopyalama işlemi sırasında açıkça ayarlanmış olacaktır. Özgün meta verileri kopyalama öncesinde tutmak için, kopyalama yöntemlerinden birini çağırmadan önce hedef Blobun anlık görüntüsünü oluşturun.

Kopyalama işleminin durumunu almak için hedef Blobun üzerindeki Blobproperties. CopyStatus özelliğini denetleyin. Kopyalama tamamlandığında son blob uygulanır.

Bir kopyalama işlemini iptal ettiğinizde, hedef Blobun kopyalama durumu Copystatus. durdurulduolarak ayarlanır.

Abortcopyfromuri ve Abortcopyfromuriasync yöntemleri devam eden bir kopyalama işlemini iptal eder.

// 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’ları

Azure SDK 'Ları hakkında daha fazla bilgi alın:

Sonraki adımlar

Aşağıdaki konular, Azure REST API 'Lerini kullanarak blob 'ları kopyalama ve devam eden kopyalama işlemlerini iptal etme hakkında bilgiler içerir.