Partilhar via


Criar e listar versões de blobs no .NET

O controlo de versões de blobs cria automaticamente uma versão anterior de um blob sempre que for modificado ou eliminado. Quando o controlo de versões de blobs está ativado, pode restaurar uma versão anterior de um blob para recuperar os seus dados se forem modificados ou eliminados incorretamente.

Para uma proteção de dados ideal, a Microsoft recomenda ativar o controlo de versões de blobs e a eliminação recuperável de blobs para a sua conta de armazenamento. Para obter mais informações, veja Controlo de versões de blobs e Eliminação recuperável para blobs.

Modificar um blob para acionar uma nova versão

O exemplo de código seguinte mostra como acionar a criação de uma nova versão com a biblioteca de cliente do Armazenamento do Microsoft Azure para .NET, versão 12.5.1 ou posterior. Antes de executar este exemplo, certifique-se de que ativou o controlo de versões para a sua conta de armazenamento.

O exemplo cria um blob de blocos e, em seguida, atualiza os metadados do blob. Atualizar os metadados do blob aciona a criação de uma nova versão. O exemplo obtém a versão inicial e a versão atual e mostra que apenas a versão atual inclui os metadados.

public static async Task UpdateVersionedBlobMetadata(BlobContainerClient blobContainerClient, 
                                                     string blobName)
{
    try
    {
        // Create the container.
        await blobContainerClient.CreateIfNotExistsAsync();

        // Upload a block blob.
        BlockBlobClient blockBlobClient = blobContainerClient.GetBlockBlobClient(blobName);

        string blobContents = string.Format("Block blob created at {0}.", DateTime.Now);
        byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);

        string initalVersionId;
        using (MemoryStream stream = new MemoryStream(byteArray))
        {
            Response<BlobContentInfo> uploadResponse = 
                await blockBlobClient.UploadAsync(stream, null, default);

            // Get the version ID for the current version.
            initalVersionId = uploadResponse.Value.VersionId;
        }

        // Update the blob's metadata to trigger the creation of a new version.
        Dictionary<string, string> metadata = new Dictionary<string, string>
        {
            { "key", "value" },
            { "key1", "value1" }
        };

        Response<BlobInfo> metadataResponse = 
            await blockBlobClient.SetMetadataAsync(metadata);

        // Get the version ID for the new current version.
        string newVersionId = metadataResponse.Value.VersionId;

        // Request metadata on the previous version.
        BlockBlobClient initalVersionBlob = blockBlobClient.WithVersion(initalVersionId);
        Response<BlobProperties> propertiesResponse = await initalVersionBlob.GetPropertiesAsync();
        PrintMetadata(propertiesResponse);

        // Request metadata on the current version.
        BlockBlobClient newVersionBlob = blockBlobClient.WithVersion(newVersionId);
        Response<BlobProperties> newPropertiesResponse = await newVersionBlob.GetPropertiesAsync();
        PrintMetadata(newPropertiesResponse);
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

static void PrintMetadata(Response<BlobProperties> propertiesResponse)
{
    if (propertiesResponse.Value.Metadata.Count > 0)
    {
        Console.WriteLine("Metadata values for version {0}:", propertiesResponse.Value.VersionId);
        foreach (var item in propertiesResponse.Value.Metadata)
        {
            Console.WriteLine("Key:{0}  Value:{1}", item.Key, item.Value);
        }
    }
    else
    {
        Console.WriteLine("Version {0} has no metadata.", propertiesResponse.Value.VersionId);
    }
}

Listar versões de blobs

Para listar versões de blobs, especifique o parâmetro BlobStates com o campo Versão . As versões são listadas da versão mais antiga para a mais recente.

O seguinte exemplo de código mostra como listar versões de blobs.

private static void ListBlobVersions(BlobContainerClient blobContainerClient, 
                                           string blobName)
{
    try
    {
        // Call the listing operation, specifying that blob versions are returned.
        // Use the blob name as the prefix. 
        var blobVersions = blobContainerClient.GetBlobs
            (BlobTraits.None, BlobStates.Version, prefix: blobName)
            .OrderByDescending(version => version.VersionId).Where(blob => blob.Name == blobName);

        // Construct the URI for each blob version.
        foreach (var version in blobVersions)
        {
            BlobUriBuilder blobUriBuilder = new BlobUriBuilder(blobContainerClient.Uri)
            {
                BlobName = version.Name,
                VersionId = version.VersionId
            };

            if ((bool)version.IsLatestVersion.GetValueOrDefault())
            {
                Console.WriteLine("Current version: {0}", blobUriBuilder);
            }
            else
            {
                Console.WriteLine("Previous version: {0}", blobUriBuilder);
            }
        }
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

Copiar uma versão de blob anterior sobre o blob base

Pode executar uma operação de cópia para promover uma versão através do respetivo blob base, desde que o blob base esteja numa camada online (frequente ou esporádica). A versão permanece, mas o destino é substituído por uma cópia que pode ser lida e escrita.

O seguinte exemplo de código mostra como copiar uma versão de blob através do blob base:

public static async Task<BlockBlobClient> CopyVersionOverBaseBlobAsync(
    BlockBlobClient client,
    string versionTimestamp)
{
    // Instantiate BlobClient with identical URI and add version timestamp
    BlockBlobClient versionClient = client.WithVersion(versionTimestamp);

    // Restore the specified version by copying it over the base blob
    await client.SyncUploadFromUriAsync(versionClient.Uri);

    // Return the client object after the copy operation
    return client;
}

Recursos

Para saber mais sobre a gestão de versões de blobs com a biblioteca de cliente Armazenamento de Blobs do Azure para .NET, veja os seguintes recursos.

Recursos da biblioteca de cliente

Ver também