Pregunta

Tengo una pregunta muy simple (espero!) - sólo quiero averiguar si existe una burbuja (con un nombre he definido) en un contenedor especial. Voy a descargarla si existe, y si no lo hace, entonces voy a hacer otra cosa.

He hecho algunas búsquedas en los intertubes y al parecer no solía ser una función llamada DoesExist o algo similar ... pero como con muchos de los Azure API, esto ya no parece estar allí (o si se trata de , tiene un nombre muy hábilmente disfrazado).

¿Fue útil?

Solución

La nueva API tiene la llamada a la función .Exists (). Sólo asegúrese de que utiliza el GetBlockBlobReference, que no realiza la llamada al servidor. Esto hace que la función tan fácil como:

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

Otros consejos

Nota: Esta respuesta no está actualizado ahora. Por favor, véase la respuesta de Richard como una manera fácil de comprobar la existencia

No, no se está perdiendo algo simple ... hemos hecho un buen trabajo de ocultar este método en la nueva biblioteca StorageClient. :)

Me acaba de escribir un blog para responder a su pregunta: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob .

La respuesta corta es:. Uso CloudBlob.FetchAttributes (), que hace una petición de cabeza contra la blob

Seem cojos que usted necesita para capturar una excepción para probar que existe la burbuja.

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 la mancha es público puede, por supuesto, simplemente envía una solicitud HTTP HEAD - de cualquiera de los millones y millones de idiomas / medio ambiente / plataformas que saben cómo hacer que -. Y comprobar la respuesta API

El núcleo Azure son REST basada en XML HTTP interfaces. La biblioteca StorageClient es una de las muchas posibles envolturas alrededor de ellos. Aquí hay otro que Sriram Krishnan hizo en Python:

http: //www.sriramkrishnan. com / blog / 2008/11 / python-wrapper-para-ventanas-azure.html

También muestra cómo autenticar a nivel HTTP.

he hecho una cosa similar para mí en C #, porque yo prefiero ver Azure a través de la lente de HTTP / REST en lugar de a través de la lente de la biblioteca StorageClient. Durante bastante tiempo no me había molestado en poner en práctica un método ExistsBlob. Todos mis manchas eran públicas, y fue trivial para hacer HTTP HEAD.

El nuevo Azure Storage Library de Windows ya contiene el método existe (). Está en el Microsoft.WindowsAzure.Storage.dll.

Disponible como NuGet paquete
Creado por: Microsoft
Id: WindowsAzure.Storage
Versión: 2.0.5.1

Ver también MSDN

Si no te gusta usar el método excepción a continuación, la versión básica de C # de lo que sugiere Judell está por debajo. Sin embargo, Aviso que realmente debería manejar otras respuestas posibles también.

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 el SDK actualizado, una vez que tenga la CloudBlobReference puede llamar existe () en su referencia.

http: // MSDN .microsoft.com / es-es / library / microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx

Esta es la manera de hacerlo. Mostrando código completo para aquellos que lo necesitan.

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

A pesar de que la mayoría de las respuestas aquí son técnicamente correctos, la mayoría de los ejemplos de código están haciendo llamadas síncronas / bloqueo. A menos que esté obligado por una plataforma o código muy antigua base, llamadas HTTP deben siempre pueden hacer asynchonously, y el SDK apoya plenamente en este caso. Sólo tiene que utilizar en lugar de ExistsAsync() Exists().

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

Si su burbuja es público y que necesita sólo metadatos:

        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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top