检查Azure存储中是否存在Blob

我有一个非常简单的问题(我希望!) – 我只想找出一个blob(带有我定义的名称)是否存在于一个特定的容器中。 如果确实存在,我会下载它,如果不存在,我会做别的。

我已经做了一些searchintertubes,显然曾经是一个名为DoesExist或类似的function…但与许多Azure的API,这似乎不再在那里(或者如果是,有一个非常巧妙的伪装的名字)。

新的API具有.Exists()函数调用。 只要确保你使用GetBlockBlobReference ,它不会执行到服务器的调用。 它使得function如下:

 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请求。

似乎跛脚,你需要捕捉一个exception来testing它的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请求 – 从任何知道如何做的语言/环境/平台中的任何一个 – 然后检查响应。

核心Azure API是基于RESTful XML的HTTP接口。 StorageClient库是围绕它们的许多可能的包装之一。 这是Sriram Krishnan在Python中做的另一个例子:

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

它还显示了如何在HTTP级别进行身份validation。

我在C#中为自己做了类似的事情,因为我更喜欢通过HTTP / REST的镜头而不是通过StorageClient库的镜头来看Azure。 有一段时间我甚至没有打算实施一个ExistsBlob方法。 我所有的斑点都是公开的,做HTTP HEAD是微不足道的。

新的Windows Azure存储库已经包含了Exist()方法。 它在Microsoft.WindowsAzure.Storage.dll中。

可作为NuGet包使用
创build者:Microsoft
Id:WindowsAzure.Storage
版本:2.0.5.1

另见msdn

如果你不喜欢使用exception方法,那么judellbuild议的基本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,一旦您拥有CloudBlob参考,您可以在您的参考中调用Exists()。

请参阅http://msdn.microsoft.com/zh-CN/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx

Interesting Posts