Question

J'ai une question très simple (je l'espère!) - Je veux juste savoir si un blob (avec un nom que je l'ai défini) existe dans un récipient particulier. Je vais le télécharger si elle existe, et si elle ne le fait pas alors je vais faire autre chose.

Je l'ai fait quelques recherches sur les intertubes et apparemment il était une fonction appelée DoesExist ou quelque chose de similaire ... mais avec tant de ne plus cette API Azure, semble être là (ou si elle est , a un nom déguisé très intelligemment).

Était-ce utile?

La solution

La nouvelle API a l'appel de fonction .Exists (). Assurez-vous que vous utilisez le GetBlockBlobReference, qui ne fonctionne pas à l'appel au serveur. Il rend la fonction aussi facile que:

public static bool BlobExistsOnCloud(CloudBlobClient client, 
    string containerName, string key)
{
     return client.GetContainerReference(containerName)
                  .GetBlockBlobReference(key)
                  .Exists();  
}

Autres conseils

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, vous ne manque pas simple ... quelque chose que nous avons fait un bon travail de cacher cette méthode dans la nouvelle bibliothèque de StorageClient. :)

Je viens d'écrire un billet de blog pour répondre à votre question:

Semblent boiteux que vous devez attraper une exception pour tester 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, envoyez une requête HTTP HEAD - de l'un des zillions de langues / environnements / plates-formes qui savent comment le faire -. Et vérifier la réponse

Le noyau API Azure sont RESTful interfaces HTTP basé sur XML. La bibliothèque StorageClient est l'un des nombreux emballages possibles autour d'eux. Voici une autre que Sriram Krishnan a fait en Python:

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

Il a également montre comment authentifier au niveau HTTP.

Je l'ai fait une chose similaire pour moi-même en C #, parce que je préfère voir Azure à travers la lentille de HTTP / REST plutôt que par la lentille de la bibliothèque StorageClient. Pendant un certain temps, je l'avais même pas pris la peine de mettre en œuvre une méthode de ExistsBlob. Tous mes blobs étaient publiques, et il était trivial de le faire HTTP HEAD.

Le nouveau Windows Azure Storage Library contient déjà la méthode exist (). D'une manière dans le Microsoft.WindowsAzure.Storage.dll.

Disponible en NuGet Paquet
Créé par: Microsoft
Id: WindowsAzure.Storage
Version: 2.0.5.1

Voir aussi msdn

Si vous ne aimez pas en utilisant la méthode d'exception alors la version de base c # de ce Judell suggère est ci-dessous. Attention cependant que vous devriez vraiment gérer d'autres réponses possibles aussi.

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.

Voir http: // msdn .microsoft.com / fr-fr / bibliothèque / microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx

Ceci est la façon dont 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.
        }

Bien que la plupart des réponses ici sont techniquement correct, la plupart des exemples de code font des appels synchrones / blocage. À moins que vous êtes lié par une plate-forme très ancienne ou la base du code, les appels HTTP doivent toujours faire asynchonously, et le SDK, il soutient pleinement dans ce cas. Il suffit d'utiliser ExistsAsync() au lieu de Exists().

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

Si votre blob est public et vous avez juste besoin 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top