【问题标题】:How can I append to a memoryStream in a foreach loop without overwriting it's contents?如何在 foreach 循环中附加到 memoryStream 而不会覆盖它的内容?
【发布时间】:2019-06-23 03:51:21
【问题描述】:

我目前正在进行返回 MemoryStream 对象的 api 调用。我在遍历 for 循环并使用 copyTo 方法将内存流附加到另一个循环时遇到问题。它会覆盖流中已经存在的内容。

到目前为止,我已经尝试了几乎所有堆栈溢出答案的组合,但都无法获得正确的结果。

                MemoryStream docStream2 = new MemoryStream();
                MemoryStream docStream3 = new MemoryStream();

                docStream = (MemoryStream)ApiCall
                docStream2 = (MemoryStream)ApiCall
                docStream3 = (MemoryStream)ApiCall

                docStream.Position = 0;
                docStream2.Position = 0;
                docStream2.CopyTo(docStream);
                docStream.Position = docStream.Length;
                docStream3.Position = 0;
                docStream3.CopyTo(docStream);

                return docStream

我希望得到一个包含每个 docStream memoryStream 对象的所有内容的流。相反,我只得到最后一个流。我还考虑过制作一个流列表,但我还没有找到一种将流列表从 webapi2 返回到 mvc4 应用程序的方法,但这是一个附带问题。提前致谢!

【问题讨论】:

  • 假设docStream是空的,你不需要移动它的位置:当你CopyTo它时,当前位置将被设置到流的末尾。但是当您开始复制其他流的内容时,docStream 需要为空。因此,使用全新的MemoryStream,您的代码将照常运行。

标签: c# stream memorystream


【解决方案1】:

我会使用WriteTo,因为您不必担心阅读流的位置。

知道了这一点,您需要做的就是确保结果流的位置在您想要的位置(结束)。

考虑这个测试应用:

// Create some data
var stuff = Enumerable.Range(0, 15)
                        .Select(x => (byte)x)
                        .ToArray();

// Create some streams
var ms1 = new MemoryStream();
var ms2 = new MemoryStream();
var ms3 = new MemoryStream();

// write some data to the streams for a test
ms1.Write(stuff, 0, 5);
ms2.Write(stuff, 5, 5);
ms3.Write(stuff, 10, 5);

// make sure we are at the end of the result stream
ms1.Seek(0, SeekOrigin.End);

// write the other streams to the result
ms2.WriteTo(ms1);
ms3.WriteTo(ms1);

// test it's working
Console.WriteLine(string.Join(", ", ms1.ToArray()));

输出

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 2016-03-12
    • 2014-03-07
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多