Pergunta

Eu tenho uma pergunta muito simples (espero!) - Eu só quero descobrir se um blob (com um nome que eu defini) existe em um contêiner específico. Vou fazer o download se existir e, se não acontecer, farei outra coisa.

Eu fiz algumas pesquisas nos intertubos e, aparentemente nome muito inteligentemente disfarçado).

Foi útil?

Solução

A nova API possui a chamada de função .Exists (). Apenas certifique -se de usar o GetBlockBlobReference, que não executa a chamada para o servidor. 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();  
}

Outras dicas

Nota: Esta resposta está desatualizada agora. Consulte a resposta de Richard para uma maneira fácil de verificar a existência

Não, você não está perdendo algo simples ... Fizemos um bom trabalho ao esconder esse método na nova biblioteca Storageclient. :)

Acabei de escrever uma postagem no blog para responder sua pergunta: http://blog.smarx.com/postss/testing-existence-of-a-windows-azure-blob.

A resposta curta é: use CloudBlob.FetchAttributes (), que faz uma solicitação de cabeça contra o blob.

Parece coxo que você precisa pegar uma exceção para testá -lo que 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 blob for público, é claro, basta enviar uma solicitação de cabeça HTTP - de qualquer um dos zilhões de idiomas/ambientes/plataformas que sabem como fazer isso - e verifique a resposta.

As APIs do Core Azure são interfaces HTTP baseadas em XML RESTful. A biblioteca Storageclient é uma das muitas embalagens possíveis ao seu redor. Aqui está outro que Sriram Krishnan fez em Python:

http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html

Ele também mostra como autenticar no nível HTTP.

Eu fiz uma coisa semelhante para mim em C#, porque prefiro ver o Azure através das lentes de HTTP/REST, e não através da lente da biblioteca Storageclient. Por um bom tempo, eu nem me incomodei em implementar um método existblob. Todos os meus bolhas eram públicos e era trivial fazer a cabeça HTTP.

A nova biblioteca de armazenamento do Windows Azure já contém o método exist (). Está no microsoft.windowszure.storage.dll.

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

Veja também MSDN

Se você não gosta de usar o método de exceção, a versão C# básica do que Judell sugere está abaixo. Cuidado, porém, que você realmente deve lidar com outras respostas possíveis 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;
}

Com o SDK atualizado, depois de ter a CloudBlobreference, você pode ligar existe () em sua referência.

Ver http://msdn.microsoft.com/en-us/library/microsoft.windowszure.storage.blob.cloudblockblob.exists.aspx

É 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.
        }

Embora a maioria das respostas aqui esteja tecnicamente correta, a maioria das amostras de código está fazendo chamadas síncronas/de bloqueio. A menos que você esteja vinculado por uma plataforma ou base de código muito antiga, as chamadas HTTP devem sempre ser feito de forma assíncrona, e o SDK suporta -o totalmente neste caso. Apenas use ExistsAsync() ao invés de Exists().

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

Se o seu blob é público e você precisar 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top