Frage

Ich habe eine sehr einfache Frage bekam (ich hoffe!) - ich will nur herausfinden, ob ein Blob (mit einem Namen I definiert haben) in einem bestimmten Behälter vorhanden ist. Ich werde es sein das Herunterladen, wenn es vorhanden ist, und wenn es dann nicht tut, werde ich etwas anderes tun.

Ich habe einige der Suche auf den intertubes getan und anscheinend gibt verwendet eine Funktion namens DoesExist oder etwas ähnliches zu sein ... aber wie bei so vielen der Azure-APIs, dies scheint nicht mehr da zu sein (oder wenn es , hat einen sehr geschickt getarnt Namen).

War es hilfreich?

Lösung

Die neue API hat den .Exists (Funktionsaufruf). So stellen Sie sicher, dass Sie die GetBlockBlobReference verwenden, die den Anruf nicht an den Server durchführt. Es macht die Funktion so einfach wie:

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

Andere Tipps

Hinweis: Diese Antwort ist jetzt veraltet aus. Bitte beachten Sie Richard Antwort für eine einfache Möglichkeit, um die Existenz zu prüfen

Nein, ich bin nicht etwas einfach fehlt ... haben wir einen guten Job diese Methode in der neuen StorageClient Bibliothek zu verstecken. :)

Ich schrieb einen Blog-Post Ihre Frage zu beantworten:

lame Scheinen, die Sie benötigen, eine Ausnahme zu fangen, es zu testen das Blob vorhanden ist.

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

Wenn der Blob öffentlich ist, kann man natürlich nur eine HTTP HEAD-Anforderung senden - von einem der Myriaden von Sprachen / Umgebungen / Plattformen, die wissen, wie man das tun -. Und die Antwort überprüfen

Der Kern Azure APIs sind RESTful XML-basierte HTTP-Schnittstellen. Die StorageClient Bibliothek ist eine von vielen möglichen Wrapper um sie herum. Hier ist eine andere, dass Sriram Krishnan in Python hat:

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

Es zeigt auch, wie bei der HTTP-Ebene zu authentifizieren.

Ich habe eine ähnliche Sache für mich in C # getan, weil ich lieber Azure durch die Linse von HTTP / REST anstatt durch die Linse der StorageClient Bibliothek zu sehen. Für eine ganze Weile ich nicht einmal die Mühe gemacht hatte eine ExistsBlob Methode zu implementieren. Alle meine Kleckse waren öffentlich, und es war trivial HTTP HEAD zu tun.

Die neue Windows Azure Storage-Bibliothek enthält bereits den Exist () -Methode. Es ist in der Microsoft.WindowsAzure.Storage.dll.

Erhältlich als NuGet Paket
Erstellt von: Microsoft
Id: WindowsAzure.Storage
Version: 2.0.5.1

Siehe auch Msdn

Wenn Sie nicht wie mit der Ausnahme Methode dann der grundlegende c # Version von dem, was Judell schlägt unten. Beachten Sie jedoch, dass Sie sollten wirklich andere mögliche Reaktionen behandeln.

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

Mit dem aktualisierten SDK, sobald Sie die CloudBlobReference haben Sie anrufen können exists () auf Ihrer Referenz.

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

Das ist die Art, wie ich es tun. Angezeigt vollständigen Code für diejenigen, die es brauchen.

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

Obwohl die meisten Antworten hier sind technisch korrekt, die meisten Codebeispiele machen synchron / Sperrung Anrufe. Es sei denn, Sie von einer sehr alten Plattform oder Code-Basis gebunden sind, HTTP Anrufe sollte immer werden asynchonously getan, und das SDK unterstützt es vollständig in diesem Fall. Verwenden Sie einfach ExistsAsync() statt Exists().

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

Wenn Ihr Blob ist öffentlich und Sie müssen nur Metadaten:

        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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top