Если ваш сценарий позволяет вам заменить исходный поток, то вы можете проверить, поддерживает ли он поиск, и, если нет, прочитать его содержимое и обернуть их в новый MemoryStream
, который вы затем сможете использовать для последующих операций.
static string PeekStream(ref Stream stream)
{
string content;
var reader = new StreamReader(stream);
content = reader.ReadToEnd();
if (stream.CanSeek)
{
stream.Seek(0, SeekOrigin.Begin);
}
else
{
stream.Dispose();
stream = new MemoryStream(Encoding.UTF8.GetBytes(content));
}
return content;
}
Вышеупомянутое довольно неэффективно, поскольку оно должно выделять память в два раза больше вашего контента.Я бы порекомендовал адаптировать части вашего кода, к которым вы обращаетесь к потоку (после прочтения всего его содержимого), чтобы они вместо этого могли получить доступ к сохраненной копии вашего содержимого.Например:
string content;
using (var reader = new StreamReader(stream))
content = reader.ReadToEnd();
// Process content here.
string line;
using (var reader = new StringReader(content))
while ((line = reader.ReadLine()) != null)
Console.WriteLine(line);
Поскольку StringReader
только читает из вашей строки content
, вы не будете тратить память на создание избыточных копий ваших данных.