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 effectué quelques recherches sur les intertubes et apparemment, il existait une fonction appelée DoesExist ou quelque chose de similaire ... nom très habilement déguisé).
La nouvelle API a l'appel de fonction .Exists (). Assurez-vous simplement que vous utilisez la variable GetBlockBlobReference
, qui n’effectue pas l’appel au serveur. Cela rend la fonction aussi simple que:
public static bool BlobExistsOnCloud(CloudBlobClient client,
string containerName, string key)
{
return client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.Exists();
}
Note: Cette réponse est obsolète maintenant. S'il vous plaît voir la réponse de Richard pour un moyen facile de vérifier l'existence
Non, il ne vous manque pas quelque chose de simple ... nous avons bien caché cette méthode dans la nouvelle bibliothèque StorageClient. :)
Je viens d'écrire un article sur le 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 fait une demande HEAD contre le blob.
Vous semblez boiteux qu'il vous faille attraper une exception pour vérifier si le 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;
}
}
}
Si le blob est public, vous pouvez bien sûr simplement envoyer une demande HTTP HEAD - à partir de l'un des zillions de langages/environnements/plates-formes qui savent comment procéder - et vérifier la réponse.
Les API Azure principales sont des interfaces HTTP basées sur XML RESTful. La bibliothèque StorageClient est l’un des nombreux wrappers possibles autour d’elle. Voici une autre chose que Sriram Krishnan a faite 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 la même chose en C #, car je préfère voir Azure à travers l'objectif de HTTP/REST plutôt que de celui de la bibliothèque StorageClient. Pendant longtemps, je n'avais même pas pris la peine d'implémenter une méthode ExistsBlob. Toutes mes tâches étaient publiques et il était trivial de faire HTTP HEAD.
La nouvelle bibliothèque de stockage Windows Azure contient déjà la méthode Exist () . Elle se trouve dans Microsoft.WindowsAzure.Storage.dll.
Disponible en tant que paquet NuGet
Créé par: Microsoft
Id: WindowsAzure.Storage
Version: 2.0.5.1
Si vous n'aimez pas utiliser la méthode d'exception, la version de base en c # de ce que suggère judell est ci-dessous. Attention, vous devez également gérer d’autres réponses possibles.
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
return true;
}
else
{
return false;
}
Avec le SDK mis à jour, une fois que vous avez le CloudBlobReference, vous pouvez appeler Exists () sur votre référence.
Bien que la plupart des réponses ici soient techniquement correctes, la plupart des exemples de code effectuent des appels synchrones/bloquants. À moins que vous ne soyez liés 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 les prend pleinement en charge dans ce cas. Utilisez simplement ExistsAsync()
au lieu de Exists()
.
bool exists = await client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.ExistsAsync();
C'est comme ça que je le fais. Afficher le code complet pour ceux qui en ont besoin.
// 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.
}
Si votre blob est public et que vous n'avez besoin que de métadonnées:
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