如何检查azure block blob中是否有数据
我试图找到一种更优雅的方法来检查我创建的blob存储中是否有任何内容 我有一个从blob存储读取数据的服务。我基本上需要确保当我的服务重新启动时,它会在正常运行之前检查blob中是否有任何内容需要读取和处理 我似乎找不到检查blockblob是否为空的方法。我想出了一种方法,但我想知道是否有更优雅的方法: 这是我的解决方案,请检查您是否能够下载任何内容。当然行如何检查azure block blob中是否有数据,azure,azure-storage-blobs,Azure,Azure Storage Blobs,我试图找到一种更优雅的方法来检查我创建的blob存储中是否有任何内容 我有一个从blob存储读取数据的服务。我基本上需要确保当我的服务重新启动时,它会在正常运行之前检查blob中是否有任何内容需要读取和处理 我似乎找不到检查blockblob是否为空的方法。我想出了一种方法,但我想知道是否有更优雅的方法: 这是我的解决方案,请检查您是否能够下载任何内容。当然行 public bool IsBlobEmpty() { string text; using (var memorySt
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;
}
您可以使用Azure Storage Blob API获取Blob的元数据信息并检查其大小- 来自服务器的响应标头包含内容长度属性
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.
您要检查容器内部。下面的代码返回给定容器中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;
}
私有只读CloudBlobClient\u blobClient;
公共列表GetBlockBlobNames(字符串containerName,
字符串前缀=空)
{
变量名称=新列表();
var container=_blobClient.GetContainerReference(containerName.ToLower());
if(container.Exists())
{
IEnumerable collection=container.ListBlobs(前缀,true);
//循环容器中的项并输出长度和URI。
foreach(集合中的IListBlobItem项)
{
如果(项目为CloudBlockBlob)
{
var blob=(CloudBlockBlob)项;
Name.Add(blob.Name);
}
else if(项目为CloudPageBlob)
{
var pageBlob=(CloudPageBlob)项;
Name.Add(pageBlob.Name);
}
else if(项为CloudBlobDirectory)
{
var目录=(CloudBlobDirectory)项;
}
}
}
返回姓名;
}
当您说blob为空时
,您的意思是如果文件的大小为0字节
或文件不包含任何数据(大小可能超过0字节)
?文件不包含任何数据。因此,如果我的服务被重新映像,并且如果之前有写入blob的内容,我希望读取该数据并对其进行处理,然后继续正常运行。在这种情况下(假设您的文件大小不是零字节,并且只包含空格),您的方法是有意义的。尽管你可能想修剪你读过的文本,这样你就可以去掉前导和尾随的空格。如果文件大小为零字节,@jangelfdez的回答是有意义的。该文件将只包含json数组,或者不包含任何内容(如果以前从未写入过)。所以它应该只为null或大于0字节。在这种情况下,我将使用您的方法。正如您在对@jangelfdez的回答的评论中提到的,如果文件确实包含一些数据,则需要两个调用—一个用于查找大小,另一个用于读取文件包含数据的内容。用你的方法,你只需要打一个电话。酷!但是,如果内容不是空的,则必须进行另一个调用来获取内容。如果需要,可以使用get Blob调用来检查标题:它获取元数据和内容,因此您只需检查容器是否存在。但是容器可以在没有任何blockblob的情况下存在。它是lke检查文件夹是否存在,而不是文件是否存在。我还是个新手,我只是惊讶于blob上没有一个简单的属性来检查这个。据我所知,我们无法检查容器是否有blob。但是,在上面的代码中,您使用returncollection.Any()代码>如果要返回布尔值。