如何合并两个内存流?
我有两个MemoryStream实例。
如何将它们合并到一个实例中?
好吧,现在我无法从一个MemoryStream复制到另一个。 这是一个方法:
public static Stream ZipFiles(IEnumerable 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's length will be zero } catch (Exception) { } finally { if (storer != null) storer.Close(); } return result; }
使用CopyTo或CopyToAsync非常简单:
var streamOne = new MemoryStream(); FillThisStreamUp(streamOne); var streamTwo = new MemoryStream(); DoSomethingToThisStreamLol(streamTwo); streamTwo.CopyTo(streamOne); // streamOne holds the contents of both
人民的框架。 框架 。
根据上面@Will分享的答案,这里是完整的代码:
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; } }
并使用async
合并流集合:
async Task Main() { var list = new List> { 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 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; } }
-
创建第三个(让它为
mergedStream
)MemoryStream
,其长度等于第一和第二长度的总和 -
将第一个
MemoryStream
写入mergedStream
(使用GetBuffer()
从MemoryStream
获取byte[]
) -
将第二个
MemoryStream
写入mergedStream
(使用GetBuffer()
) -
记住写作时的偏移。
它相当附加 ,但完全不清楚什么是MemoryStreams上的合并操作