¿Hay alguna manera de evitar que StreamReader realice ningún almacenamiento en búfer?StreamReader sin búfer
Estoy tratando de manejar la salida de un Proceso que puede ser binario o de texto. La salida se verá como una respuesta HTTP, p. Ej.
Content-type: application/whatever
Another-header: value
text or binary data here
Lo que quiero hacer es analizar los encabezados utilizando un StreamReader
, y después lee ya sea desde su BaseStream
o la StreamReader
para manejar el resto del contenido. Esto es básicamente lo que empecé con:
private static readonly Regex HttpHeader = new Regex("([^:]+): *(.*)");
private void HandleOutput(StreamReader reader)
{
var headers = new NameValueCollection();
string line;
while((line = reader.ReadLine()) != null)
{
Match header = HttpHeader.Match(line);
if(header.Success)
{
headers.Add(header.Groups[1].Value, header.Groups[2].Value);
}
else
{
break;
}
}
DoStuff(reader.ReadToEnd());
}
Esto parece a la basura de datos binarios. Así que cambié la última línea a algo como esto:
if(headers["Content-type"] != "text/html")
{
// reader.BaseStream.Position is not at the same place that reader
// makes it looks like it is.
// i.e. reader.Read() != reader.BaseStream.Read()
DoBinaryStuff(reader.BaseStream);
}
else
{
DoTextStuff(reader.ReadToEnd());
}
... pero StreamReader buffers en su entrada, por lo reader.BaseStream está en la posición incorrecta. ¿Hay alguna forma de desactivar el StreamReader? ¿O puedo decirle a StreamReader que restablezca la transmisión de regreso a donde está StreamReader?
Matt - puede elaborar en "StreamReader lee bloques a la vez, por lo que reader.BaseStream está en la posición incorrecta". – jro
espero que eso esté más claro. –