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 existir, farei outra coisa.
Eu fiz algumas pesquisas nos intertubos e, aparentemente, costumava haver uma função chamada DoesExist ou algo semelhante ... mas, como em muitas APIs do Azure, isso não parece mais estar lá (ou, se estiver, tem um nome muito disfarçado).
c#
azure
azure-blob-storage
John
fonte
fonte
Respostas:
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:fonte
len(blob_service.list_blobs(container_name, file_name)) > 0
Nota: Esta resposta está desatualizada agora. Por favor, veja 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 ocultar esse método na nova biblioteca StorageClient. :)
Acabei de escrever uma postagem no blog para responder sua pergunta: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob .
A resposta curta é: use CloudBlob.FetchAttributes (), que faz uma solicitação HEAD no blob.
fonte
OpenRead
ele não lançará ou retornará um fluxo vazio ou algo assim. Você só receberá erros quando iniciar o download. É muito mais fácil lidar com isso tudo em um só lugar :)Parece lamentável que você precise capturar uma exceção para testar se o blob existe.
fonte
Se o blob for público, é claro, você pode simplesmente enviar uma solicitação HTTP HEAD - de qualquer um dos zilhões de idiomas / ambientes / plataformas que sabem como fazer isso - e verificar a resposta.
As principais APIs do Azure são interfaces HTTP baseadas em XML RESTful. A biblioteca StorageClient é um dos muitos wrappers possíveis em torno deles. Aqui está outro que Sriram Krishnan fez em Python:
http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html
Também mostra como se autenticar no nível HTTP.
Fiz uma coisa semelhante em C #, porque prefiro ver o Azure pelas lentes de HTTP / REST do que pelas lentes da biblioteca StorageClient. Por um bom tempo, eu nem me preocupei em implementar um método ExistsBlob. Todos os meus blobs eram públicos, e era trivial fazer o HTTP HEAD.
fonte
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
fonte
Se você não gosta de usar o método de exceção, a versão básica do c # que Judell sugere está abaixo. Cuidado, porém, que você também deve lidar com outras respostas possíveis.
fonte
Se seu blob for público e você precisar apenas de metadados:
fonte
Com o SDK atualizado, depois de ter o CloudBlobReference, você pode chamar Exists () em sua referência.
Consulte http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx
fonte
É assim que eu faço. Mostrando o código completo para quem precisa.
fonte
Embora a maioria das respostas aqui seja tecnicamente correta, a maioria dos exemplos de código está fazendo chamadas síncronas / bloqueadas. A menos que você esteja vinculado a uma plataforma ou base de código muito antiga, as chamadas HTTP sempre devem ser feitas de forma assíncrona e o SDK oferece suporte total a esse caso. Basta usar em
ExistsAsync()
vez deExists()
.fonte
Exists()
é síncrono, pois bloqueia um encadeamento até que seja concluído.await ExistsAscyn()
é assíncrono, pois não. Ambos seguem o mesmo fluxo lógico em que a próxima linha de código não começa até que a anterior seja concluída, mas é a natureza não-bloqueadoraExistsAsync
que a torna assíncrona.Aqui está uma solução diferente se você não gostar das outras soluções:
Estou usando a versão 12.4.1 do pacote Azure.Storage.Blobs NuGet.
Recebo um objeto Azure.Pageable que é uma lista de todos os blobs em um contêiner. Em seguida, verifico se o nome do BlobItem é igual à propriedade Name de cada blob dentro do contêiner utilizando o LINQ . (Se tudo é válido, é claro)
Espero que isso ajude alguém no futuro.
fonte