我正在尝试找一种更优雅的方法来检查我创建的blob存储中是否有任何内容。
我有一个从blob存储读取的服务。我基本上需要确保当我的服务重新启动时,它会检查blob中是否有任何内容可以在正常运行之前进行读取和处理。
我似乎无法找到检查阻塞是否为空的方法。我提出了一种方法来做到这一点,但我想知道是否有一种更优雅的方式:
这是我的解决方案,只需检查您是否能够下载任何内容。当然有效..
public bool IsBlobEmpty()
{
string text;
using (var memoryStream = new MemoryStream())
{
blockBlob.DownloadToStream(memoryStream);
text = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
if (text.Length > 0)
{
return false;
}
}
return true;
}
答案 0 :(得分:2)
您可以使用Azure存储Blob API获取blob的元数据信息并检查其大小 - https://msdn.microsoft.com/en-us/library/azure/dd179394.aspx
服务器的响应头包含Content-Length属性
x-ms-meta-Name: myblob.txt
x-ms-meta-DateUploaded: Sun, 23 Oct 2013 18:45:18 GMT
x-ms-blob-type: BlockBlob
x-ms-lease-status: unlocked
x-ms-lease-state: available
Content-Length: 11
Content-Type: text/plain; charset=UTF-8
Date: Sun, 23 Oct 2013 19:49:38 GMT
ETag: "0x8CAE97120C1FF22"
Accept-Ranges: bytes
x-ms-version: 2013-08-15
Last-Modified: Wed, 23 Oct 2013 19:49
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.
答案 1 :(得分:0)
您想检查容器内部。以下代码返回给定容器内blob的名称。你可以调整你想要的方式。
private readonly CloudBlobClient _blobClient;
public List<string> GetBlockBlobNames(string containerName,
string prefix = null)
{
var names = new List<string>();
var container = _blobClient.GetContainerReference(containerName.ToLower());
if (container.Exists())
{
IEnumerable<IListBlobItem> collection = container.ListBlobs(prefix, true);
// Loop over items within the container and output the length and URI.
foreach (IListBlobItem item in collection)
{
if (item is CloudBlockBlob)
{
var blob = (CloudBlockBlob) item;
names.Add(blob.Name);
}
else if (item is CloudPageBlob)
{
var pageBlob = (CloudPageBlob) item;
names.Add(pageBlob.Name);
}
else if (item is CloudBlobDirectory)
{
var directory = (CloudBlobDirectory) item;
}
}
}
return names;
}