Kopírování objektu blob s Azure Storage klientskými knihovnami

Tento článek ukazuje, jak zkopírovat objekt blob v Azure Storage účtu. Také ukazuje, jak přerušit operaci asynchronního kopírování. V příkladu kódu se používá Azure Storage klientských knihoven.

O kopírování objektů blob

Když zkopírujete objekt blob v rámci stejného účtu úložiště, jedná se o synchronní operaci. Když kopírujete mezi účty, jedná se o asynchronní operaci.

Zdrojovým objektem blob pro operaci kopírování může být objekt blob bloku, doplňovací objekt blob, objekt blob stránky nebo snímek. Pokud cílový objekt blob již existuje, musí být stejného typu jako zdrojový objekt blob. Existující cílový objekt blob se přepíše.

Cílový objekt blob není možné upravit, když probíhá operace kopírování. Cílový objekt blob může mít pouze jednu nevyřízenou operaci kopírování. Jinými slovy, objekt blob nemůže být cílem několika čekajících operací kopírování.

Vždy se zkopíruje celý zdrojový objekt blob nebo soubor. Kopírování rozsahu bajtů nebo sady bloků se nepodporuje.

Při kopírování objektu blob se do cílového objektu blob zkopírují systémové vlastnosti se stejnými hodnotami.

Operace kopírování může mít libovolnou z následujících forem:

  • Zkopírujte zdrojový objekt blob do cílového objektu blob s jiným názvem. Cílovým objektem blob může být existující objekt blob stejného typu (blok, připojení nebo stránka) nebo nový objekt blob vytvořený operací kopírování.
  • Zkopírujte zdrojový objekt blob do cílového objektu blob se stejným názvem a efektivně nahraďte cílový objekt blob. Taková operace kopírování odebere všechny nepo potvrzení bloků a přepíše metadata cílového objektu blob.
  • Zkopírujte zdrojový soubor ve službě Azure File do cílového objektu blob. Cílovým objektem blob může být existující objekt blob bloku nebo nový objekt blob bloku vytvořený operací kopírování. Kopírování ze souborů do objektů blob stránky nebo doplňovací objekty blob se nepodporuje.
  • Zkopírujte snímek přes jeho základní objekt blob. Zvýšením úrovně snímku na pozici základního objektu blob můžete obnovit starší verzi objektu blob.
  • Zkopírujte snímek do cílového objektu blob s jiným názvem. Výsledný cílový objekt blob je zapisovatelný objekt blob, nikoli snímek.

Kopírování objektu blob

Pokud chcete zkopírovat objekt blob, zavolejte jednu z následujících metod:

Metody StartCopyFromUri StartCopyFromUriAsync a vrátí objekt CopyFromUriOperation obsahující informace o operaci kopírování.

Následující příklad kódu získá objekt BlobClient představující dříve vytvořený objekt blob a zkopíruje ho do nového objektu blob ve stejném kontejneru:

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

Přerušení operace kopírování

Přerušení operace kopírování má za výsledek cílový objekt blob o nulové délce. Metadata cílového objektu blob ale budou mít nové hodnoty zkopírované ze zdrojového objektu blob nebo explicitně nastavené během operace kopírování. Pokud chcete zachovat původní metadata před kopírováním, vytvořte snímek cílového objektu blob před voláním jedné z metod kopírování.

Zkontrolujte vlastnost BlobProperties.CopyStatus cílového objektu blob a získejte stav operace kopírování. Konečný objekt blob se po dokončení kopírování potvrzen.

Při přerušení operace kopírování se stav kopírování cílového objektu blob nastaví na CopyStatus.Aborted.

Metody AbortCopyFromUri a AbortCopyFromUriAsync zruší probíhající operaci kopírování.

// 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.");
}

Sady Azure SDK

Získejte další informace o předplatcích Azure SDK:

Další kroky

Následující témata obsahují informace o kopírování objektů blob a přerušení probíhajících operací kopírování pomocí rozhraní Azure REST API.