Поток памяти не расширяется

Я пытаюсь прочитать вложение электронной почты, и я получаю сообщение об ошибке "Поток памяти не расширяется". Я исследовал это, и большинство решений, казалось, связано с динамическим определением размера буфера, но я уже это делаю. Я не очень разбираюсь в потоках памяти, поэтому я хотел бы знать, ПОЧЕМУ, что это проблема. Спасибо.

foreach (MailMessage m in messages)
{
   byte[] myBuffer = null;
   if (m.Attachments.Count > 0)
   {
      //myBuffer = new byte[25 * 1024];  old way 
      myBuffer = new byte[m.Attachments[0].ContentStream.Length];
      int read;
      while ((read = m.Attachments[0].ContentStream.Read(myBuffer, 0, myBuffer.Length)) > 0)
      {
          // error occurs on executing next statement
          m.Attachments[0].ContentStream.Write(myBuffer, 0, read);
      }

      ... more unrelated code ...

Ответ 1

Если вы создаете MemoryStream по предварительно выделенному байтовому массиву, он не может расширяться (т.е. дольше, чем размер, указанный вами при запуске). Вместо этого, почему бы просто не использовать:

using (var ms = new MemoryStream())
{
   // Do your thing, for example:
   m.Attachments[0].ContentStream.CopyTo(ms);

   return ms.ToArray(); // This gives you the byte array you want.
}

Ответ 2

Вам нужно заменить строку

m.Attachments[0].ContentStream.Write(myBuffer, 0, read);

с линией, которая записывает ранее созданный MemoryStream, например

foreach (MailMessage m in messages)
{
   byte[] myBuffer = null;
   if (m.Attachments.Count > 0)
   {
      //myBuffer = new byte[25 * 1024];  old way 
      myBuffer = new byte[m.Attachments[0].ContentStream.Length];
      int read;
      MemoryStream ms = new MemoryStream();
      while ((read = m.Attachments[0].ContentStream.Read(myBuffer, 0, myBuffer.Length)) > 0)
      {
          ms.Write(myBuffer, 0, read);
      }