2013-12-06 4 views
11

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

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 ... 
+3

Если цель вашего потока состоит в том, чтобы прочитать вложение, почему линия, которую вы выделили **, напишите ** на нее? –

+0

Этот фрагмент является частью более крупного процесса, который считывает вложение в буфер, а затем передает буфер (и xmlDocument, который находится в теле письма) другому процессу. Я выделил строку, которая генерировала исключение. –

ответ

23

При создании 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. 
} 
3

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

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); 
     } 
Смежные вопросы