Tengo una pregunta muy simple (¡espero!): Solo quiero saber si existe un blob (con un nombre que he definido) en un contenedor en particular. Lo estaré descargando si existe, y si no existe, haré otra cosa.
He hecho algunas búsquedas en los intertubos y aparentemente solía haber una función llamada DoesExist o algo similar ... pero como con muchas de las API de Azure, esto ya no parece estar allí (o si lo está, tiene un nombre muy hábilmente disfrazado).
c#
azure
azure-blob-storage
Juan
fuente
fuente
Respuestas:
La nueva API tiene la llamada a la función .Exists (). Solo asegúrese de usar el
GetBlockBlobReference
, que no realiza la llamada al servidor. Hace que la función sea tan fácil como:fuente
len(blob_service.list_blobs(container_name, file_name)) > 0
Nota: esta respuesta está desactualizada ahora. Consulte la respuesta de Richard para ver una forma fácil de verificar la existencia
No, no te estás perdiendo algo simple ... hicimos un buen trabajo al ocultar este método en la nueva biblioteca StorageClient. :)
Acabo de escribir una publicación de blog para responder a su pregunta: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob .
La respuesta corta es: use CloudBlob.FetchAttributes (), que realiza una solicitud HEAD contra el blob.
fuente
OpenRead
, no arrojará ni devolverá un Stream vacío o algo así. Solo obtendrá errores cuando comience a descargarlo. Es mucho más fácil manejar todo esto en un solo lugar :)Parece lamentable que necesite atrapar una excepción para probar que el blob existe.
fuente
Si el blob es público, por supuesto, solo puede enviar una solicitud HTTP HEAD, desde cualquiera de los millones de idiomas / entornos / plataformas que saben cómo hacerlo, y verificar la respuesta.
Las principales API de Azure son interfaces HTTP RESTful basadas en XML. La biblioteca StorageClient es uno de los muchos envoltorios posibles a su alrededor. Aquí hay otro que Sriram Krishnan hizo en Python:
http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html
También muestra cómo autenticarse en el nivel HTTP.
He hecho algo similar para mí en C #, porque prefiero ver Azure a través de la lente de HTTP / REST en lugar de a través de la lente de la biblioteca StorageClient. Durante bastante tiempo ni siquiera me había molestado en implementar un método ExistsBlob. Todos mis blobs eran públicos, y era trivial hacer HTTP HEAD.
fuente
La nueva Biblioteca de almacenamiento de Windows Azure ya contiene el método Exist (). Está en Microsoft.WindowsAzure.Storage.dll.
Disponible como paquete NuGet
Creado por: Microsoft
Id: WindowsAzure.
Versión de almacenamiento: 2.0.5.1
Ver también msdn
fuente
Si no le gusta usar el método de excepción, la versión básica de C # de lo que sugiere judell está a continuación. Sin embargo, tenga cuidado de que realmente también debería manejar otras posibles respuestas.
fuente
Si su blob es público y solo necesita metadatos:
fuente
Con el SDK actualizado, una vez que tenga CloudBlobReference puede llamar a Exists () en su referencia.
Ver http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx
fuente
Así es como lo hago. Mostrando código completo para aquellos que lo necesitan.
fuente
Aunque la mayoría de las respuestas aquí son técnicamente correctas, la mayoría de los ejemplos de código están haciendo llamadas sincrónicas / bloqueantes. A menos que esté sujeto a una plataforma o base de código muy antigua, las llamadas HTTP siempre deben realizarse de forma asíncrona, y el SDK lo admite por completo en este caso. Solo use en
ExistsAsync()
lugar deExists()
.fuente
Exists()
es sincrónico porque bloquea un hilo hasta que se completa.await ExistsAscyn()
es asíncrono porque no lo hace. Ambos siguen el mismo flujo lógico en el sentido de que la siguiente línea de código no comienza hasta que se termina la anterior, pero es la naturaleza sin bloqueo loExistsAsync
que la hace asíncrona.Aquí hay una solución diferente si no le gustan las otras soluciones:
Estoy usando la versión 12.4.1 del paquete NuGet de Azure.Storage.Blobs.
Obtengo un objeto Azure.Pageable que es una lista de todos los blobs en un contenedor. Luego verifico si el nombre del BlobItem es igual a la propiedad Name de cada blob dentro del contenedor utilizando LINQ . (Si todo es válido, por supuesto)
Esperemos que esto ayude a alguien en el futuro.
fuente