Проверка наличия 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
Если вам не нравится использовать метод исключения, то базовая версия 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() в своей ссылке.
вот как я это делаю. Показывает полный код для тех, кто в нем нуждается.
// 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.
}