title: Appending to MemoryStream
body: <p>I'm trying to append some data to a stream.  This works well with <code>FileStream</code>, but not for <code>MemoryStream</code> due to the fixed buffer size.</p>
  
  <p>The method which writes data to the stream is separated from the method which creates the stream (I've simplified it greatly in the below example).  The method which creates the stream is unaware of the length of data to be written to the stream.</p>
  
  <pre><code>public void Foo(){
      byte[] existingData = System.Text.Encoding.UTF8.GetBytes("foo");
      Stream s1 = new FileStream("someFile.txt", FileMode.Append, FileAccess.Write, FileShare.Read);
      s1.Write(existingData, 0, existingData.Length);
  
  
      Stream s2 = new MemoryStream(existingData, 0, existingData.Length, true);
      s2.Seek(0, SeekOrigin.End); //move to end of the stream for appending
  
      WriteUnknownDataToStream(s1);
      WriteUnknownDataToStream(s2); // NotSupportedException is thrown as the MemoryStream is not expandable
  }
  
  public static void WriteUnknownDataToStream(Stream s)
  {
     // this is some example data for this SO query - the real data is generated elsewhere and is of a variable, and often large, size.
     byte[] newBytesToWrite = System.Text.Encoding.UTF8.GetBytes("bar"); // the length of this is not known before the stream is created.
     s.Write(newBytesToWrite, 0, newBytesToWrite.Length);
  }
  </code></pre>
  
  <p>An idea I had was to send an expandable <code>MemoryStream</code> to the function, then append the returned data to the existing data.</p>
  
  <pre><code>public void ModifiedFoo()
  {
     byte[] existingData = System.Text.Encoding.UTF8.GetBytes("foo");
     Stream s2 = new MemoryStream(); // expandable capacity memory stream
  
     WriteUnknownDataToStream(s2);
  
     // append the data which has been written into s2 to the existingData
     byte[] buffer = new byte[existingData.Length + s2.Length];
     Buffer.BlockCopy(existingData, 0, buffer, 0, existingData.Length);
     Stream merger = new MemoryStream(buffer, true);
     merger.Seek(existingData.Length, SeekOrigin.Begin);
     s2.CopyTo(merger);
  }
  </code></pre>
  
  <p>Any better (more efficient) solutions?</p>