[C#] Azure Storage에 Blob이 있는지 확인

매우 간단한 질문이 있습니다 (희망합니다!)-특정 컨테이너에 blob (이름이 정의 된)이 있는지 확인하고 싶습니다. 존재하는 경우 다운로드하고 그렇지 않은 경우 다른 작업을 수행합니다.

나는 intertubes에서 약간의 검색을 수행했으며 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 ()를 사용하는 것입니다. 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;
        }
    }
}


답변

Blob이 공개적이라면 물론 HTTP HEAD 요청 (어떻게 하는지를 알고있는 수많은 언어 / 환경 / 플랫폼에서)을 보내 응답을 확인할 수 있습니다.

핵심 Azure API는 RESTful XML 기반 HTTP 인터페이스입니다. StorageClient 라이브러리는 가능한 많은 랩퍼 중 하나입니다. Sriram Krishnan이 Python에서 한 또 다른 기능은 다음과 같습니다.

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

또한 HTTP 레벨에서 인증하는 방법을 보여줍니다.

C #에서도 비슷한 일을했습니다. StorageClient 라이브러리의 렌즈가 아닌 HTTP / REST의 렌즈를 통해 Azure를 보는 것을 선호하기 때문입니다. 꽤 오랫동안 ExistsBlob 메서드를 구현하지 않아도되었습니다. 내 모든 blob은 공개되었으며 HTTP HEAD를 수행하는 것은 쉽지 않습니다.


답변

새 Windows Azure 저장소 라이브러리에는 Exist () 메서드가 이미 포함되어 있습니다. Microsoft.WindowsAzure.Storage.dll에 있습니다.

NuGet 패키지로 사용 가능
작성자 : Microsoft
ID : WindowsAzure.Storage
버전 : 2.0.5.1

msdn 참조


답변

예외 방법을 사용하지 않으려면 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;
}


답변

Blob이 공개적이고 메타 데이터 만 필요한 경우 :

        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