83 votes

Renvoyer StreamReader au début

Je suis en train de lire un fichier ligne par ligne et je veux être en mesure de redémarrer la lecture par l'appel d'une méthode Rewind().

Comment puis-je manipuler mon System.IO.StreamReader et/ou de ses sous-jacent System.IO.FileStream à partir de la lecture du fichier?

J'ai eu l'idée ingénieuse d'utiliser FileStream.Seek(long, SeekOffset) pour se déplacer dans le fichier, mais il n'a pas d'effet de la enfermant System.IO.StreamReader. Je pourrais Close() et de réaffecter à la fois le flux et le lecteur referecnes, mais j'espère que il ya une meilleure façon.

126voto

Amy Points 8019

Vous devez chercher sur le flux, comme vous l’avez fait, puis appeler DiscardBufferedData sur le StreamReader . Documentation ici :

Edit: Ajout d'un exemple de code:

 Stream s = new MemoryStream();
StreamReader sr = new StreamReader(s);
// later... after we read stuff
s.Position = 0;
sr.DiscardBufferedData();        // reader now reading from position 0
 

19voto

Bojan Skrchevski Points 3908

Tout cela est bon si les propriétés BaseStream peuvent être définies à Position .

Si vous ne pouvez pas (par exemple, un flux HttpWebResponse ), une bonne option serait de copier le flux dans un MemoryStream ... vous pouvez y définir Position à 0 et redémarrez le Stream autant que vous le souhaitez.

5voto

Limo Wan Kenobi Points 1435

StreamReader a une propriété BaseStream qui pourrait être utilisé pour accéder à des flux réel.

Si le BaseStream est seekeable (CanSeek de la propriété), vous pouvez régler la Position de la propriété à 0 pour redémarrer le flux.

J'espère que ça aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X