如何检查azure block blob中是否有数据

如何检查azure block blob中是否有数据,azure,azure-storage-blobs,Azure,Azure Storage Blobs,我试图找到一种更优雅的方法来检查我创建的blob存储中是否有任何内容 我有一个从blob存储读取数据的服务。我基本上需要确保当我的服务重新启动时,它会在正常运行之前检查blob中是否有任何内容需要读取和处理 我似乎找不到检查blockblob是否为空的方法。我想出了一种方法,但我想知道是否有更优雅的方法: 这是我的解决方案,请检查您是否能够下载任何内容。当然行 public bool IsBlobEmpty() { string text; using (var memorySt

我试图找到一种更优雅的方法来检查我创建的blob存储中是否有任何内容

我有一个从blob存储读取数据的服务。我基本上需要确保当我的服务重新启动时,它会在正常运行之前检查blob中是否有任何内容需要读取和处理

我似乎找不到检查blockblob是否为空的方法。我想出了一种方法,但我想知道是否有更优雅的方法:

这是我的解决方案,请检查您是否能够下载任何内容。当然行

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()如果要返回布尔值。