Поток памяти не расширяется
Я пытаюсь прочитать вложение электронной почты, и я получаю сообщение об ошибке "Поток памяти не расширяется". Я исследовал это, и большинство решений, казалось, связано с динамическим определением размера буфера, но я уже это делаю. Я не очень разбираюсь в потоках памяти, поэтому я хотел бы знать, ПОЧЕМУ, что это проблема. Спасибо.
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);
}