I'm attempting to read an email attachment and I'm getting a "Memory Stream is not expandable" error. I researched this some and most of the solutions seemed related to determining the size of the buffer dynamically, but I'm already doing that. I'm not very experienced with memory streams, so I'd like to know WHY this is a problem. Thanks.
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 ...
MemoryStream does not have any unmanaged resources to dispose, so you don't technically have to dispose of it. The effect of not disposing a MemoryStream is roughly the same thing as dropping a reference to a byte[] -- the GC will clean both up the same way.
MemoryStream encapsulates data stored as an unsigned byte array. The encapsulated data is directly accessible in memory. Memory streams can reduce the need for temporary buffers and files in an application. The current position of a stream is the position at which the next read or write operation takes place.
If you create a MemoryStream over a pre-allocated byte array, it can't expand (ie. get longer than the size you specified when you started). Instead, why not just use:
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. }
You need to replace the line
m.Attachments[0].ContentStream.Write(myBuffer, 0, read);
with a line that writes to a previously created MemoryStream
, e.g.
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); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With