Вопрос

У меня очень простой вопрос (я надеюсь!) - Я просто хочу выяснить, существует ли BLOB (с именем, которое я определенному) существует в определенном контейнере. Я буду загружать его, если оно будет существовать, и если это не так, я сделаю что-то еще.

Я сделал несколько поисков на меж метабах и, по-видимому, раньше был функцией под названием Doeskist или что-то подобное ... но как и с таким количеством аписов Azure, это больше не должно быть там (или если оно есть, имеет Очень умно замаскированное имя).

Это было полезно?

Решение

Новый API имеет функцию .Exists (). Просто убедитесь, что вы используете GetBlockBlobReference, который не выполняет вызов на сервер. Это делает функцию так же просто, как:

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

Другие советы

Примечание: этот ответ устарел сейчас. Пожалуйста, смотрите ответ Ричарда на простой способ проверить наличие наличия

Нет, вы не пропустите что-то простое ... Мы сделали хорошую работу по сокрытии этого метода в новой библиотеке StorageClient. :)

Я только что написал сообщение в блоге, чтобы ответить на ваш вопрос: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob..

Короткий ответ: используйте CloudBlob.fetchattributes (), который делает запрос на голову против BLOB.

Кажется, хромает, что вам нужно поймать исключение, чтобы проверить его, существует 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;
        }
    }
}

Если CLOB является общественным, вы можете, конечно, просто отправить запрос HTTP HEAD - с любых зиллов языков / окружений / платформ, которые знают, как это сделать - и проверьте ответ.

Основные APIS AZURE API на основе RESTSITS HTTP-интерфейсов на основе XML. Библиотека StorageClient является одной из многих возможных обертков вокруг них. Вот еще один, что Шрирам Кришнань сделал в Python:

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

Он также показывает, как аутентифицировать на уровне HTTP.

Я сделал подобное для себя в C #, потому что предпочитаю видеть Azure через объектив HTTP / RECT, а не через объектив библиотеки StorageClient. На некоторое время я даже не удосужился реализовать метод Exisclob. Все мои капли были публичными, и это было тривиально сделать HTTP Head.

Новая библиотека хранения Windows Azure уже содержит метод существующего (). Это в Microsoft.windowsazure.Storage.dll.

Доступно как пакет Nuget
Создано: Microsoft
ID: Windowsazure.Storage.
Версия: 2.0.5.1

Смотрите также MSDN

Если вам не нравится использовать метод исключения, то базовая версия C #, что предлагает Удейство, ниже. Остерегайтесь, хотя вы действительно должны обращаться с другими возможными ответами.

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

Со обновленным SDK, как только у вас есть CloudBlobreference, вы можете позвонить, существует () на вашу ссылку.

Видеть http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.asc.aspx.

Это то, что я делаю это. Показывая полный код для тех, кому это нужно.

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

Хотя большинство ответов здесь являются технически правильными, большинство образцов кода делают синхронные / блокирующие вызовы. Если вы не связаны с очень старой платформой или базой кода, HTTP-вызовы должны всегда Будьте сделаны асинхоинже, и SDK полностью поддерживает его в этом случае. Просто использовать ExistsAsync() вместо Exists().

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

Если ваш BLOB публично, и вам нужно только метаданные:

        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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top