Проверка наличия blob-объекта в хранилище Azure

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

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

8 ответов


новый API имеет .Существует() вызов функции. Просто убедитесь, что вы используете 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;
        }
    }
}

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

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

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

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

Я сделал аналогичную вещь для себя в C#, потому что я предпочитаю видеть Azure через объектив HTTP/REST, а не через объектив библиотеки StorageClient. Довольно долго я даже не удосужился реализовать метод ExistsBlob. Все мои пятна были публичными, и это было тривиально. HTTP HEAD.


новая библиотека хранения Windows Azure уже содержит метод Exist (). Это в Microsoft.На сайте windowsazure.Место хранения.файл DLL.

доступно как пакет NuGet
Создано: Microsoft
Идентификатор: Пакет Windowsazure.Хранение
Версия: 2.0.5.1

см. также msdn


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

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 вы можете вызвать Exists() в своей ссылке.

см http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.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.
        }