Domanda

Ho una domanda molto semplice (spero!) - Voglio solo sapere se un blob (con un nome che ho definito) esiste un particolare contenitore.Sarò il download se esiste, e se non ha poi farò qualcosa d'altro.

Ho fatto qualche ricerca su intertubes e a quanto pare ci deve essere utilizzato una funzione chiamata DoesExist o qualcosa di simile...ma, come per tante delle Api di Azure, questo non sembra più esserci (o se lo è, è molto abilmente camuffato il nome).

È stato utile?

Soluzione

La nuova API ha la funzione di chiamata .Exists (). Basta fare in modo di utilizzare il GetBlockBlobReference, che non effettua la chiamata al server. Rende la funzione di semplice come:

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

Altri suggerimenti

Nota: Questa risposta non è aggiornato ora. Si prega di vedere la risposta di Richard di un modo semplice per verificare l'esistenza

No, non state perdendo qualcosa di semplice ... abbiamo fatto un buon lavoro di nascondere questo metodo nella nuova libreria StorageClient. :)

Ho appena scritto un post sul blog per rispondere alla tua domanda: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob .

La risposta breve è:. Uso CloudBlob.FetchAttributes (), che fa una richiesta HEAD contro il blob

Sembrano zoppo che è necessario per intercettare un'eccezione per testare esiste il blob.

public static bool Exists(this CloudBlob blob)
{
    try
    {
        blob.FetchAttributes();
        return true;
    }
    catch (StorageClientException e)
    {
        if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
        {
            return false;
        }
        else
        {
            throw;
        }
    }
}

Se il blob è pubblico, è possibile, naturalmente, è sufficiente inviare un'HTTP TESTA di richiesta-da una qualsiasi delle miriadi di linguaggi/ambienti/piattaforme che sanno come fare -- e controllare la risposta.

Il nucleo Azzurro Api RESTful XML-basato l'interfaccia HTTP.StorageClient biblioteca è uno dei tanti possibili wrapper intorno a loro.Ecco un altro che Sriram Krishnan ha fatto in Python:

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

Essa mostra anche come l'autenticazione a HTTP livello.

Ho fatto una cosa simile per me in C#, perché preferisco vedere Azure attraverso la lente di HTTP/REST, piuttosto che attraverso l'obiettivo della raccolta StorageClient.Per un po', io non avevo nemmeno preso la briga di implementare un ExistsBlob metodo.Tutto il mio blob sono pubblici, ed è stato banale fare HTTP TESTA.

La nuova Azure libreria di Windows contiene già il metodo exist (). E'nel Microsoft.WindowsAzure.Storage.dll.

Disponibile come pacchetto NuGet
Creato da:
Microsoft Id: WindowsAzure.Storage
Versione: 2.0.5.1

Vedi anche MSDN

Se non ti piace utilizzando il metodo eccezione quindi la versione base C # di ciò che suggerisce judell è al di sotto. Attenzione però che si dovrebbe davvero per gestire altre possibili risposte anche.

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
    return true;
}
else
{
    return false;
}

Con l'SDK aggiornato, una volta che hai la CloudBlobReference è possibile chiamare Esiste () sul vostro riferimento.

http: // msdn .microsoft.com / en-us / library / microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx

Questo è il modo in cui lo faccio. Visualizzazione codice completo per chi ne ha bisogno.

        // 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.
        }

Sebbene la maggior parte delle risposte qui sono tecnicamente corrette, la maggior parte dei campioni di codice stanno facendo / chiamate blocco sincrone. A meno che non siete tenuti da una vecchia piattaforma o un codice di base, chiamate HTTP dovrebbero sempre essere fatto asynchonously, e l'SDK supporta pienamente in questo caso. Basta usare ExistsAsync() invece di Exists().

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

Se il vostro blob è pubblico ed è necessario solo i metadati:

        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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top