Как я могу добавить в memoryStream в цикле foreach, не перезаписывая его содержимое? - PullRequest
0 голосов
/ 30 января 2019

В настоящее время я делаю вызовы API, которые возвращают объекты MemoryStream.У меня проблемы с итерацией цикла 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, но это побочная проблема.Заранее спасибо!

1 Ответ

0 голосов
/ 30 января 2019

Id использует 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 its working
Console.WriteLine(string.Join(", ", ms1.ToArray()));

Выход

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