c# - pricing - storage account azure




Verificando se existe um blob no armazenamento do Azure (7)

Eu tenho uma pergunta muito simples (espero!) - Eu só quero descobrir se existe um blob (com um nome que eu tenha definido) em um determinado contêiner. Eu vou baixá-lo se ele existir, e se isso não acontecer, então eu farei outra coisa.

Eu fiz algumas pesquisas nos intertubes e, aparentemente, costumava haver uma função chamada DoesExist ou algo semelhante ... mas como acontece com muitas das APIs do Azure, isso não parece mais estar lá (ou, se é, tem um nome muito habilmente disfarçado).


É assim que eu faço. Mostrando código completo para quem precisa.

        // Parse the connection string and return a reference to the storage account.
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("AzureBlobConnectionString"));

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve reference to a previously created container.
        CloudBlobContainer container = blobClient.GetContainerReference("ContainerName");

        // Retrieve reference to a blob named "test.csv"
        CloudBlockBlob blockBlob = container.GetBlockBlobReference("test.csv");

        if (blockBlob.Exists())
        {
          //Do your logic here.
        }

A nova Biblioteca de Armazenamento do Windows Azure já contém o método Exist (). Está no Microsoft.WindowsAzure.Storage.dll.

Disponível como pacote NuGet
Criado por: Microsoft
Id: WindowsAzure.Storage
Versão: 2.0.5.1

Veja também msdn


Embora a maioria das respostas aqui seja tecnicamente correta, a maioria das amostras de código está fazendo chamadas síncronas / de bloqueio. A menos que você esteja vinculado a uma plataforma ou base de código muito antiga, as chamadas HTTP devem sempre ser feitas de forma assíncrona, e o SDK oferece suporte total a ele nesse caso. Apenas use ExistsAsync() vez de Exists() .

bool exists = await client.GetContainerReference(containerName)
    .GetBlockBlobReference(key)
    .ExistsAsync();

Parecem coxos que você precisa pegar uma exceção para testar se o blob existe.

public static bool Exists(this CloudBlob blob)
{
    try
    {
        blob.FetchAttributes();
        return true;
    }
    catch (StorageClientException e)
    {
        if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
        {
            return false;
        }
        else
        {
            throw;
        }
    }
}

Se o seu blob é público e você precisa apenas de metadados:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "HEAD";
        string code = "";
        try
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            code = response.StatusCode.ToString();
        }
        catch 
        {
        }

        return code; // if "OK" blob exists

Se você não gosta de usar o método de exceção, a versão básica c # do que o judell sugere está abaixo. Cuidado, porém, que você realmente deveria lidar com outras possíveis respostas também.

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
    return true;
}
else
{
    return false;
}

A nova API tem a chamada de função .Exists (). Apenas certifique-se de usar o GetBlockBlobReference , que não executa a chamada para o servidor. Isso torna a função tão fácil quanto:

public static bool BlobExistsOnCloud(CloudBlobClient client, 
    string containerName, string key)
{
     return client.GetContainerReference(containerName)
                  .GetBlockBlobReference(key)
                  .Exists();  
}




azure-blob-storage