У меня очень простой вопрос (надеюсь!) - я просто хочу узнать, существует ли капля (с именем, которое я определил) в конкретном контейнере. Я скачаю его, если он существует, а если нет, то займусь чем-нибудь другим.
Я провел несколько поисков по интервалам, и, по-видимому, раньше была функция под названием DoesExist или что-то подобное ... но, как и в случае со многими API-интерфейсами Azure, этого больше нет (или, если есть, есть очень хитро замаскированное имя).
Ответы:
В новом API есть вызов функции .Exists (). Просто убедитесь, что вы используете
GetBlockBlobReference
, который не выполняет вызов сервера. Это делает функцию такой же простой, как:источник
len(blob_service.list_blobs(container_name, file_name)) > 0
Примечание: этот ответ сейчас устарел. Пожалуйста, посмотрите ответ Ричарда, чтобы узнать, как легко проверить существование
Нет, вы не упускаете чего-то простого ... мы хорошо поработали, скрывая этот метод в новой библиотеке StorageClient. :)
Я просто написал сообщение в блоге, чтобы ответить на ваш вопрос: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob .
Короткий ответ: используйте CloudBlob.FetchAttributes (), который выполняет запрос HEAD для большого двоичного объекта.
источник
OpenRead
он не будет генерировать или возвращать пустой поток или что- то в этом роде . Вы получите ошибки только тогда, когда начнете скачивать с него.Кажется хромым, что вам нужно поймать исключение, чтобы проверить, существует ли blob.
источник
Если 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 было тривиальным делом.
источник
Новая библиотека хранилища Windows Azure уже содержит метод Exist (). Он находится в Microsoft.WindowsAzure.Storage.dll.
Доступен как пакет NuGet.
Создан: Microsoft
Id: WindowsAzure.Storage
Version: 2.0.5.1.
См. Также msdn
источник
Если вам не нравится использовать метод исключения, то основная версия C # того, что предлагает judell, приведена ниже. Однако помните, что вам действительно следует обрабатывать и другие возможные ответы.
источник
Если ваш большой двоичный объект является общедоступным и вам нужны только метаданные:
источник
С обновленным SDK, как только у вас будет CloudBlobReference, вы можете вызвать Exists () для своей ссылки.
См. Http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx
источник
Я так и делаю. Показан полный код для тех, кому он нужен.
источник
Хотя большинство ответов здесь технически верны, большинство примеров кода совершают синхронные / блокирующие вызовы. Если вы не привязаны к очень старой платформе или базе кода, HTTP-вызовы всегда должны выполняться асинхронно, и SDK полностью поддерживает это в этом случае. Просто используйте
ExistsAsync()
вместоExists()
.источник
Exists()
является синхронным в том смысле, что он блокирует поток до его завершения.await ExistsAscyn()
является асинхронным в том смысле, что это не так. Оба следуют одному и тому же логическому потоку: следующая строка кода не начинается до тех пор, пока не будет завершена предыдущая, но именно неблокирующая природаExistsAsync
делает ее асинхронной.Вот другое решение, если вам не нравятся другие решения:
Я использую пакет NuGet Azure.Storage.Blobs версии 12.4.1.
Я получаю объект Azure.Pageable, который представляет собой список всех больших двоичных объектов в контейнере. Затем я проверяю, совпадает ли имя BlobItem со свойством Name каждого большого двоичного объекта внутри контейнера, использующего LINQ . (Если все действительно так, конечно)
Надеюсь, это поможет кому-то в будущем.
источник
С библиотекой хранилища BLOB-объектов Azure v12 вы можете использовать
BlobBaseClient.Exists()/BlobBaseClient.ExistsAsync()
Ответил на другой аналогичный вопрос: https://stackoverflow.com/a/63293998/4865541
источник