Вопрос:

Проверка наличия капли в Azure Storage

c# azure azure-blob-storage

49847 просмотра

9 ответа

2341 Репутация автора

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

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

Автор: John Источник Размещён: 15.04.2010 05:23

Ответы (9)


48 плюса

47542 Репутация автора

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

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

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

Короткий ответ: используйте CloudBlob.FetchAttributes (), который выполняет запрос HEAD против blob.

Автор: smarx Размещён: 16.04.2010 05:25

7 плюса

146 Репутация автора

Если blob является общедоступным, вы можете, конечно, просто отправить запрос 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. Все мои капли были общедоступными, и было тривиально делать HTTP HEAD.

Автор: judell Размещён: 17.04.2010 04:49

15 плюса

151 Репутация автора

Похоже, что вам нужно поймать исключение, чтобы проверить, существует ли 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;
        }
    }
}
Автор: nathanw Размещён: 04.05.2010 09:10

1 плюс

400 Репутация автора

Если вам не нравится использовать метод исключения, то базовая версия 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;
}
Автор: Mad Pierre Размещён: 18.11.2011 08:49

5 плюса

2268 Репутация автора

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

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

См. Также msdn

Автор: huha Размещён: 03.05.2013 09:31

163 плюса

4862 Репутация автора

Решение

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

public static bool BlobExistsOnCloud(CloudBlobClient client, 
    string containerName, string key)
{
     return client.GetContainerReference(containerName)
                  .GetBlockBlobReference(key)
                  .Exists();  
}
Автор: Richard Размещён: 10.05.2013 02:58

1 плюс

10167 Репутация автора

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

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

Автор: Babak Naffas Размещён: 05.08.2013 10:16

0 плюса

974 Репутация автора

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

        // 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.
        }
Автор: Apollo Размещён: 26.02.2018 02:33

0 плюса

20870 Репутация автора

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

bool exists = await client.GetContainerReference(containerName)
    .GetBlockBlobReference(key)
    .ExistsAsync();
Автор: Todd Menier Размещён: 17.10.2018 04:06
Вопросы из категории :
32x32