J'ai une question très simple (j'espère!) - Je veux juste savoir si un blob (avec un nom que j'ai défini) existe dans un conteneur particulier. Je le téléchargerai s'il existe, et si ce n'est pas le cas, je ferai autre chose.
J'ai fait quelques recherches sur les tubes intertubes et apparemment, il y avait une fonction appelée DoesExist ou quelque chose de similaire ... mais comme avec tant d'API Azure, cela ne semble plus être là (ou si c'est le cas, a un nom très habilement déguisé).
Réponses:
La nouvelle API a l'appel de fonction .Exists (). Assurez-vous simplement que vous utilisez le
GetBlockBlobReference
, qui n'effectue pas l'appel au serveur. Cela rend la fonction aussi simple que:la source
len(blob_service.list_blobs(container_name, file_name)) > 0
Remarque: cette réponse est désormais obsolète. Veuillez consulter la réponse de Richard pour un moyen facile de vérifier l'existence
Non, vous ne manquez pas quelque chose de simple ... nous avons bien caché cette méthode dans la nouvelle bibliothèque StorageClient. :)
Je viens d'écrire un article de blog pour répondre à votre question: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob .
La réponse courte est: utilisez CloudBlob.FetchAttributes (), qui effectue une requête HEAD sur l'objet blob.
la source
OpenRead
ça, cela ne lancera ni ne retournera un Stream vide ou quelque chose comme ça. Vous n'obtiendrez des erreurs que lorsque vous commencerez à télécharger à partir de celui-ci. Il est beaucoup plus facile de gérer tout cela en un seul endroit :)Semble boiteux que vous devez intercepter une exception pour le tester, le blob existe.
la source
Si l'objet blob est public, vous pouvez, bien sûr, simplement envoyer une requête HTTP HEAD - à partir de l'un des zillions de langues / environnements / plates-formes qui savent comment faire cela - et vérifier la réponse.
Les API Azure principales sont des interfaces HTTP basées sur XML REST. La bibliothèque StorageClient est l'un des nombreux wrappers possibles autour d'eux. En voici un autre que Sriram Krishnan a fait en Python:
http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html
Il montre également comment s'authentifier au niveau HTTP.
J'ai fait une chose similaire pour moi-même en C #, car je préfère voir Azure à travers le prisme de HTTP / REST plutôt que par le prisme de la bibliothèque StorageClient. Pendant un certain temps, je n'avais même pas pris la peine d'implémenter une méthode ExistsBlob. Tous mes blobs étaient publics et il était trivial de faire HTTP HEAD.
la source
La nouvelle bibliothèque de stockage Windows Azure contient déjà la méthode Exist (). Il se trouve dans le fichier Microsoft.WindowsAzure.Storage.dll.
Disponible en tant que package NuGet
Créé par: Microsoft
Id: WindowsAzure.Storage
Version: 2.0.5.1
Voir aussi msdn
la source
Si vous n'aimez pas utiliser la méthode d'exception, la version c # de base de ce que Judell suggère est ci-dessous. Méfiez-vous cependant que vous devez vraiment gérer d'autres réponses possibles.
la source
Si votre blob est public et que vous n'avez besoin que de métadonnées:
la source
Avec le SDK mis à jour, une fois que vous avez CloudBlobReference, vous pouvez appeler Exists () sur votre référence.
Voir http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx
la source
C'est comme ça que je le fais. Affichage du code complet pour ceux qui en ont besoin.
la source
Bien que la plupart des réponses ici soient techniquement correctes, la plupart des exemples de code effectuent des appels synchrones / bloquants. Sauf si vous êtes lié par une très ancienne plateforme ou base de code, les appels HTTP doivent toujours être effectués de manière asynchrone, et le SDK le prend entièrement en charge dans ce cas. Utilisez simplement à la
ExistsAsync()
place deExists()
.la source
Exists()
est synchrone en ce sens qu'il bloque un thread jusqu'à ce qu'il se termine.await ExistsAscyn()
est asynchrone dans la mesure où ce n'est pas le cas. Les deux suivent le même flux logique en ce sens que la ligne de code suivante ne commence pas tant que la précédente n'est pas terminée, mais c'est la nature non bloquanteExistsAsync
qui la rend asynchrone.Voici une solution différente si vous n'aimez pas les autres solutions:
J'utilise la version 12.4.1 du package NuGet Azure.Storage.Blobs.
J'obtiens un objet Azure.Pageable qui est une liste de tous les objets blob dans un conteneur. Je vérifie ensuite si le nom du BlobItem est égal à la propriété Name de chaque objet blob à l'intérieur du conteneur utilisant LINQ . (Si tout est valide, bien sûr)
Espérons que cela aide quelqu'un à l'avenir.
la source