Azure Storage に BLOB が存在するかどうかを確認する
-
27-09-2019 - |
質問
非常に単純な質問があります (そう願っています!) - (定義した名前を持つ) BLOB が特定のコンテナーに存在するかどうかを知りたいだけです。存在する場合はダウンロードしますが、存在しない場合は別のことを行います。
インターチューブについて調べてみたところ、どうやら DoesExist またはそれに似た機能と呼ばれる機能があったようです...しかし、多くの Azure API と同様に、これはもう存在しないようです (または、存在するとしても非常に巧妙に偽装された名前が付けられています)。
解決
新しいAPIは.Exists()関数呼び出しを持っています。ちょうどあなたが、サーバーへの呼び出しを実行しませんGetBlockBlobReference
を、使用することを確認します。
public static bool BlobExistsOnCloud(CloudBlobClient client,
string containerName, string key)
{
return client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.Exists();
}
他のヒント
注記:この回答は現在では古くなっています。存在を確認する簡単な方法については、Richard の回答を参照してください。
いいえ、単純なことを見逃しているわけではありません...新しい StorageClient ライブラリでこのメソッドをうまく隠しました。:)
あなたの質問に答えるためにブログ投稿を書きました。 http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob.
短い答えは次のとおりです。CloudBlob.FetchAttributes() を使用します。これは、BLOB に対して HEAD リクエストを実行します。
あなたはブロブが存在し、それをテストするための例外をキャッチする必要があることラメ見えるます。
public static bool Exists(this CloudBlob blob)
{
try
{
blob.FetchAttributes();
return true;
}
catch (StorageClientException e)
{
if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
{
return false;
}
else
{
throw;
}
}
}
ブロブが公開されている場合は、もちろん、単にHTTPのHEADリクエストを送信することができます - どのように知っていることをやるの言語/環境/プラットフォームの無数のいずれかから - 。、応答を確認します。
コアAzureのAPIは、XMLベースのHTTPインターフェイスのRESTfulです。 StorageClientライブラリは、彼らの周りの多くの可能ラッパーの一つです。ここでスリラムクリシュナンは、Pythonでやったことを他のです。
ます。http://www.sriramkrishnan。 COM /ブログ/ 2008/11 /のpython-ラッパーのためのWindows-azure.htmlする
これも示してどのようにHTTPレベルでの認証ます。
私は、HTTP / RESTのレンズを通してではなく、StorageClientライブラリのレンズを通してAzureのを見ることを好むので、C#で自分のために同様のことをやりました。非常にために私もExistsBlobメソッドを実装するために気にしていなかった一方で。すべての私の塊は、公開して、HTTP HEADを行うことが些細だっます。
あなたはjudell以下であることを示唆しているものの基本的な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;
}
更新SDKを使用すると、呼び出すことができCloudBlobReferenceはご参考に()が存在します。
これは、私はそれを行う方法です。それを必要とする人のための完全なコードを表示ます。
// 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.
}
、ほとんどのコードサンプルは、同期/ブロッキング呼び出しを行っています。あなたは、HTTP、非常に古いプラットフォームやコードベースでバインドされている場合を除き呼び出しは、の常にのasynchonously行われるべきである、とSDKは完全にこのような場合には、それをサポートしています。ただ、代わりにExistsAsync()
のExists()
を使用します。
bool exists = await client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.ExistsAsync();
あなたのブロブが公開され、必要な場合は、単にメタデータ:
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