C'è un modo per impedire a StreamReader di eseguire il buffering?Streamer Unbuffered
Sto provando a gestire l'output da un processo che può essere sia binario che testo. L'output sarà simile a una risposta HTTP, ad es.
Content-type: application/whatever
Another-header: value
text or binary data here
Quello che voglio fare è quello di analizzare le intestazioni usando un StreamReader
, e poi o leggere dalla sua BaseStream
o il StreamReader
per gestire il resto del contenuto. Ecco in sostanza cosa ho iniziato 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());
}
Questo sembra cancellare dati binari. Così ho cambiato l'ultima riga a qualcosa di simile:
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());
}
... ma StreamReader il buffer per il suo ingresso, in modo da reader.BaseStream è nella posizione sbagliata. C'è un modo per smistare StreamReader? O posso dire a StreamReader di reimpostare lo stream su dove si trova StreamReader?
Matt: puoi approfondire "StreamReader legge blocchi alla volta, quindi reader.BaseStream è nella posizione sbagliata." – jro
speriamo che sia più chiaro. –