有没有办法直接创建流对象Azure Blob或Azure块存储Blob。
IE
var s = new AzureStream(blockObject)
ms.CopyTo(s);
s.position = 200;
ms.CopyTo(s);
s.Read...
这将允许一些令人敬畏的交互,例如将数据库索引存储在azure blob中而不需要将它们拉到本地。
不确定这是否能解答您的问题,但您可以从blob中读取一系列字节。直接使用REST API时,可以在Range
或x-ms-range
标头中指定要读取的字节。
使用C#SDK时,您可以使用DownloadRangeToStream
方法,例如:
using (var ms = new MemoryStream())
{
long offset = 200;
long bytesToRead = 1024;
blob.DownloadRangeToStream(ms, offset, bytesToRead);
}
如果您的问题是“我可以将Streams与Azure Blob一起使用”,以避免在任何时间点将blob的整个大小保留在内存中,那么答案绝对是肯定的。
例如,当读取块blob时,根据此answer here,可以使用CloudBlob.OpenReadAsync
等方法将blob作为流句柄进行访问。默认缓冲区大小为4MB,但可以通过StreamMinimumReadSizeInBytes等属性进行调整。在这里,我们将blob流复制到另一个打开的输出流:
using (var stream = await myBlockBlob.OpenReadAsync(cancellationToken))
{
await stream.CopyToAsync(outputStream);
}
类似的,你可以将write a stream直接导入Blob存储:
await blockBlob.UploadFromStreamAsync(streamToSave, cancellationToken);