将byte []附加到MemoryStream

时间:2014-03-03 14:16:07

标签: c# asp.net .net c#-4.0

我正在尝试为每个文件读取byte[]并将其添加到MemoryStream中。下面是抛出错误的代码。我追加的是什么?

byte[] ba = null;
List<string> fileNames = new List<string>();
int startPosition = 0;
using (MemoryStream allFrameStream = new MemoryStream())
{
    foreach (string jpegFileName in fileNames)
    {
        ba = GetFileAsPDF(jpegFileName);

        allFrameStream.Write(ba, startPosition, ba.Length); //Error here
        startPosition = ba.Length - 1;
    }

    allFrameStream.Position = 0;

    ba = allFrameStream.GetBuffer();

    Response.ClearContent();
    Response.AppendHeader("content-length", ba.Length.ToString());
    Response.ContentType = "application/pdf";
    Response.BinaryWrite(ba);
    Response.End();
    Response.Close();              
}

错误:

  

偏移和长度超出数组范围或计数更大   比从索引到源头的元素数量   集合

2 个答案:

答案 0 :(得分:7)

startPosition不会偏移到MemoryStream,而是偏移到ba。将其更改为

allFrameStream.Write(ba, 0, ba.Length); 

所有字节数组都将附加到allFrameStream

BTW:不要使用ba = allFrameStream.GetBuffer();而是使用ba = allFrameStream.ToArray(); (实际上你不想要MemoryStream的内部缓冲区)。

答案 1 :(得分:0)

Stream.Write上的MSDN文档可能有助于澄清问题。

Streams被建模为连续的序列字节。读取或写入流会使您在流中的位置按读取或写入的字节数移动。

Write的第二个参数是 source 数组中从中开始复制字节的索引。在你的情况下,这是0,因为你想从数组的开头读取。