我正在修改现有的C#(点网核)应用程序,该应用程序读取一种二进制文件以使用Azure Blob存储。
我正在使用Windows.Azure.Storage(8.6.0)。
问题是该应用程序以非常小的块(例如5000-6000字节)从Stream中读取文件中的二进制数据。这反映了数据的结构。
伪代码示例:
var blocks = new List<byte[]>();
var numberOfBytesToRead = 6240;
var numberOfBlocksToRead = 1700;
using (var stream = await blob.OpenReadAsync())
{
stream.Seek(3000, SeekOrigin.Begin); // start reading at a particular position
for (int i = 1; i <= numberOfBlocksToRead; i++)
{
byte[] traceValues = new byte[numberOfBytesToRead];
stream.Read(traceValues, 0, numberOfBytesToRead);
blocks.Add(traceValues);
}
}`
如果我尝试使用OpenReadAsync()读取10mb文件,则在大约4,190,000字节后,我会在字节数组中获得无效/垃圾值。
某些文件可能超过100Mb,因此设置StreamMinimumReadSize可能不是最佳解决方案。
这里发生了什么,我该如何解决这个问题?
答案 0 :(得分:1)
无效/垃圾值是零吗?如果是这样(甚至可能),请检查stream.Read中的返回值。该方法无法保证实际读取您要求的字节数。它可以阅读更少。在这种情况下,您应该在循环中再次调用它,直到它已读取您想要的总量。快速网络搜索应该向您展示许多必要循环的示例。