Проверка наличия большого двоичного объекта в хранилище Azure - PullRequest
116 голосов
/ 15 апреля 2010

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

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

Ответы [ 10 ]

187 голосов
/ 10 мая 2013

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

public static bool BlobExistsOnCloud(CloudBlobClient client, 
    string containerName, string key)
{
     return client.GetContainerReference(containerName)
                  .GetBlockBlobReference(key)
                  .Exists();  
}
49 голосов
/ 16 апреля 2010

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

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

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

Краткий ответ: используйте CloudBlob.FetchAttributes (), который выполняет запрос HEAD для большого двоичного объекта.

16 голосов
/ 05 мая 2010

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

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

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

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

Также показано, как проходить аутентификацию на уровне HTTP.

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

5 голосов
/ 03 мая 2013

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

Доступен как пакет NuGet
Создано: Microsoft
Идентификатор: WindowsAzure.Storage
Версия: 2.0.5.1

См. Также MSDN

2 голосов
/ 18 ноября 2011

Если вам не нравится использовать метод исключения, тогда базовая версия 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;
}
1 голос
/ 17 октября 2018

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

bool exists = await client.GetContainerReference(containerName)
    .GetBlockBlobReference(key)
    .ExistsAsync();
1 голос
/ 26 февраля 2018

Вот как я это делаю. Отображение полного кода для тех, кому это нужно.

        // 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.
        }
1 голос
/ 06 августа 2013

С обновленным SDK, когда у вас есть CloudBlobReference, вы можете вызывать Exists () по вашей ссылке.

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

0 голосов
/ 31 декабря 2018

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

        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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...