blob stream Length 属性 value 始终为-1,无论文件是否为空

blob stream Length property value always -1, no matter the file empty or not

我有一个代码可以为存储上的 blob 打开一个流以读取其内容(步骤如下所述),blob 是一个 Json 文件,有时是空的,它出现在 azure portal 上,带有 0B , 可以下载打开

我检查 blobStream.Length 属性 以了解它是否为空 blob 以处理文件,出于某种原因无论文件是否为空长度 属性是 -1 而不是 0。

我在某些地方读到 -1 是 属性 的初始化值,必须调用 FetchAttributesAsync 才能更新元数据.. 我在 Microsoft 文档上读到调用 OpenReadAsync自动调用 FetchAttributesAsync,在这些文档中的备注下提到:

OpenReadAsyncDocs

FetchAttributesAsyncDocs

不确定发生了什么,问题是与 FetchAttributes 调用有关还是与打开流有关,以及为什么长度始终为 -1。

我使用 Azure.Storage.Blobs 创建一个带有连接字符串的 blob 客户端和 return blob 流来读取其内容

_blobServiceClient = new BlobServiceClient(connectionString);
blobStream = await _blobServiceClient.GetBlobContainerClient(container).GetBlobClient(blobName).OpenReadAsync(cancellationToken: cancellationToken);

在来自 OpenReadAsync 的流 return 上,我们检查长度.. 并处理文件:

if( blobStream.Length == 0 ) continue; < -- 长度总是-1

如果您想将 blob 文件作为流读取,BlobBaseClient.DownloadTo 方法会有所帮助。

BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
BlobContainerClient container = blobServiceClient.GetBlobContainerClient(containerName);
BlobClient blob = container.GetBlobClient(blobName);
MemoryStream s = new MemoryStream();
blob.DownloadTo(s);
Console.WriteLine(s.Length);

还有另一种获取 blob 内容长度的方法 BlobProperties.ContentLength

BlobClient blob = container.GetBlobClient(blobName);
var properties = blob.GetProperties();
Console.WriteLine(properties.Value.ContentLength);