143

非常に簡単な質問があります(願っています!)-特定のコンテナーにblob(定義した名前)が存在するかどうかを確認したいだけです。存在する場合はダウンロードし、存在しない場合は別のことを行います。

インターチューブで検索を行ったところ、DoesExistなどと呼ばれる関数があったようですが、多くのAzure APIと同様に、これはもう存在しないようです(存在する場合は、非常に巧妙に偽装された名前)。

4

13 に答える 13

51

注:この回答は現在古くなっています。存在を確認する簡単な方法については、リチャードの回答をご覧ください

いいえ、単純なことを見落としているわけではありません... 新しい StorageClient ライブラリでこのメソッドをうまく隠しました。:)

あなたの質問に答えるブログ投稿を書きました: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob

簡単に言えば、BLOB に対して HEAD リクエストを行う CloudBlob.FetchAttributes() を使用します。

于 2010-04-16T05:25:07.953 に答える
16

ブロブが存在することをテストするために例外をキャッチする必要があるのは不自由に思えます。

public static bool Exists(this CloudBlob blob)
{
    try
    {
        blob.FetchAttributes();
        return true;
    }
    catch (StorageClientException e)
    {
        if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
        {
            return false;
        }
        else
        {
            throw;
        }
    }
}
于 2010-05-04T21:10:20.707 に答える
9

ブロブが公開されている場合は、もちろん、HTTP HEADリクエストを送信して(その方法を知っている無数の言語/環境/プラットフォームのいずれかから)、応答を確認することができます。

コアAzureAPIは、RESTfulXMLベースのHTTPインターフェイスです。StorageClientライブラリは、それらを取り巻く多くの可能なラッパーの1つです。SriramKrishnanがPythonで行ったもう1つの方法は次のとおりです。

http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html

また、HTTPレベルで認証する方法も示しています。

StorageClientライブラリのレンズではなく、HTTP / RESTのレンズを通してAzureを表示することを好むため、C#でも同様のことを行いました。かなり長い間、私はExistsBlobメソッドを実装することすら気にしませんでした。私のブロブはすべて公開されており、HTTPHEADを実行するのは簡単でした。

于 2010-04-17T16:49:33.203 に答える
5

新しい Windows Azure ストレージ ライブラリには、Exist() メソッドが既に含まれています。Microsoft.WindowsAzure.Storage.dll にあります。

NuGet パッケージとして利用可能
作成者: Microsoft
ID: WindowsAzure.Storage
バージョン: 2.0.5.1

msdn も参照

于 2013-05-03T09:31:22.933 に答える
2

例外メソッドを使用したくない場合は、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;
}
于 2011-11-18T08:49:53.803 に答える
1

更新された SDK では、CloudBlobReference を取得したら、参照に対して Exists() を呼び出すことができます。

http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspxを参照してください。

于 2013-08-05T22:16:16.620 に答える
-1

同じ Java バージョン (新しい v12 SDK を使用)

これは、共有キー クレデンシャル承認 (アカウント アクセス キー) を使用します。

public void downloadBlobIfExists(String accountName, String accountKey, String containerName, String blobName) {
    // create a storage client using creds
    StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
    String endpoint = String.format(Locale.ROOT, "https://%s.blob.core.windows.net", accountName);
    BlobServiceClient storageClient = new BlobServiceClientBuilder().credential(credential).endpoint(endpoint).buildClient();

    BlobContainerClient container = storageClient.getBlobContainerClient(containerName);
    BlobClient blob = container.getBlobClient(blobName);
    if (blob.exists()) {
        // download blob
    } else {
        // do something else
    }
}
于 2020-09-04T08:47:30.193 に答える