How to combine two memory streams?

I have two instances of MemoryStream.

How to combine them into one copy?

Well, now I can not copy from one MemoryStream to another. Here is a way:

public static Stream ZipFiles(IEnumerable<FileToZip> filesToZip) { ZipStorer storer = null; MemoryStream result = null; try { MemoryStream memory = new MemoryStream(1024); storer = ZipStorer.Create(memory, GetDateTimeInRuFormat()); foreach (var currentFilePath in filesToZip) { string fileName = Path.GetFileName(currentFilePath.FullPath); storer.AddFile(ZipStorer.Compression.Deflate, currentFilePath.FullPath, fileName, GetDateTimeInRuFormat()); } result = new MemoryStream((int) storer.ZipFileStream.Length); storer.ZipFileStream.CopyTo(result); //Does not work! //result length will be zero } catch (Exception) { } finally { if (storer != null) storer.Close(); } return result; } 
+7
source share
3 answers

Effectively simple with CopyTo or CopyToAsync :

 var streamOne = new MemoryStream(); FillThisStreamUp(streamOne); var streamTwo = new MemoryStream(); DoSomethingToThisStreamLol(streamTwo); streamTwo.CopyTo(streamOne); // streamOne holds the contents of both 

Frames, people. Framework.

+36
source

According to the answer common to @Will above, here is the complete code:

 void Main() { var s1 = GetStreamFromString("Hello"); var s2 = GetStreamFromString(" World"); var s3 = s1.Append(s2); Console.WriteLine(Encoding.UTF8.GetString((s3 as MemoryStream).ToArray())); } public static Stream GetStreamFromString(string text) { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(text); writer.Flush(); stream.Position = 0; return stream; } public static class Extensions { public static Stream Append(this Stream destination, Stream source) { destination.Position = destination.Length; source.CopyTo(destination); return destination; } } 

And combining the stream collection with async :

 async Task Main() { var list = new List<Task<Stream>> { GetStreamFromStringAsync("Hello"), GetStreamFromStringAsync(" World") }; Stream stream = await list .Select(async item => await item) .Aggregate((current, next) => Task.FromResult(current.Result.Append(next.Result))); Console.WriteLine(Encoding.UTF8.GetString((stream as MemoryStream).ToArray())); } public static Task<Stream> GetStreamFromStringAsync(string text) { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(text); writer.Flush(); stream.Position = 0; return Task.FromResult(stream as Stream); } public static class Extensions { public static Stream Append(this Stream destination, Stream source) { destination.Position = destination.Length; source.CopyTo(destination); return destination; } } 
+1
source
  • Create a third (let it be mergedStream ) MemoryStream with a length equal to the sum of the first and second lengths

  • First mergedStream MemoryStream to mergedStream (use GetBuffer() to get byte[] from MemoryStream )

  • Enter the second MemoryStream in mergedStream (use GetBuffer() )

  • Be aware of the offset during recording.

It’s more likely to add , but it’s completely unclear what the merge operation on MemoryStreams is.

0
source

All Articles