Проверка наличия капли в Azure Storage
У меня очень простой вопрос (я надеюсь!). Я просто хочу узнать, существует ли в конкретном контейнере blob (с именем, который я определил). Я буду загружать его, если он существует, и если он этого не сделает, я сделаю что-то еще.
Я сделал несколько поисков на межтрубках, и, видимо, там была функция, называемая DoExist или что-то подобное... но, как и во многих API Azure, это уже не похоже (или если это, имеет очень искусно замаскированное имя).
Ответы
Ответ 1
Новый API имеет вызов функции .Exists(). Просто убедитесь, что вы используете GetBlockBlobReference
, который не выполняет вызов на сервер. Это облегчает выполнение функции:
public static bool BlobExistsOnCloud(CloudBlobClient client,
string containerName, string key)
{
return client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.Exists();
}
Ответ 2
Примечание. Этот ответ устарел сейчас. Пожалуйста, обратитесь к Ричарду за простой способ проверить наличие
Нет, вам не хватает чего-то простого... мы неплохо скрыли этот метод в новой библиотеке StorageClient.:)
Я только что написал сообщение в блоге, чтобы ответить на ваш вопрос: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob.
Короткий ответ: используйте CloudBlob.FetchAttributes(), который выполняет запрос HEAD против blob.
Ответ 3
Похоже, что вам нужно поймать исключение, чтобы проверить, существует ли 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;
}
}
}
Ответ 4
Если blob является общедоступным, вы можете, конечно, просто отправить запрос HTTP HEAD - из любого из уровней языков/сред/платформ, которые знают, как это сделать, и проверить ответ.
Основными API-интерфейсами Azure являются HTTP-интерфейсы RESTful на основе XML. Библиотека StorageClient является одной из многих возможных оболочек вокруг них. Здесь другой, который Шрирам Кришнан сделал в Python:
http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html
Он также показывает, как аутентифицироваться на уровне HTTP.
Я сделал аналогичную вещь для себя в С#, потому что я предпочитаю видеть Azure через объектив HTTP/REST, а не через объектив библиотеки StorageClient. Некоторое время я даже не потрудился внедрить метод ExistsBlob. Все мои капли были общедоступными, и было тривиально делать HTTP HEAD.
Ответ 5
Новая библиотека хранения Windows Azure уже содержит метод Exist(). Это находится в Microsoft.WindowsAzure.Storage.dll.
Доступно как пакет NuGet
Создано: Microsoft
Id: WindowsAzure.Storage
Версия: 2.0.5.1
См. Также msdn
Ответ 6
Если вам не нравится использовать метод исключения, то базовая версия С# того, что предлагает 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;
}
Ответ 7
С обновленным SDK, когда у вас есть CloudBlobReference, вы можете вызвать Exists() в своей ссылке.
См. http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx
Ответ 8
Так я это делаю. Показывает полный код для тех, кто в нем нуждается.
// 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.
}