Comment réinitialiser un C# .NET TextReader curseur vers le point de départ?
J'ai une méthode qui prend un StringReader
instance (la lecture à partir du presse-papiers) ou un StreamReader
instance (lecture à partir d'un fichier) et, à présent, jette, soit comme un TextReader
instance.
J'en ai besoin pour "pré-lecture" quelques-uns de la source d'entrée, puis réinitialiser le curseur remonte au début. Je n'ai pas forcément le nom de fichier d'origine. Comment puis-je faire cela?
Il est fait mention de la Seek
méthode de System.IO.Stream
mais ce n'est pas implémentée dans TextReader
, même si c'est dans StreamReader
par le biais de la Basestream
de la propriété. Cependant StringReader
ne dispose pas d'un BaseStream
propriété
Vous devez vous connecter pour publier un commentaire.
Il dépend de la
TextReader
. Si c'est unStreamReader
, vous pouvez utiliser:(En supposant que le flux sous-jacent est adressable, bien sûr.)
D'autres implémentations de
TextReader
peut pas ont un concept de "rembobinage", de la même manière queIEnumerable<T>
ne l'est pas. Dans beaucoup de façons que vous pouvez penserTextReader
comme une glorifiéIEnumerable<char>
. Il a des méthodes pour lire des morceaux entiers de données à la fois, de lire des lignes etc, mais c'est fondamentalement une "avant la lecture de type".EDIT: je ne crois pas
StringReader
prend en charge toute sorte de rembobinage - vous feriez mieux de recréer leStringReader
de la chaîne d'origine, si vous le pouvez. Si ce n'est pas possible, vous pouvez toujours créer votre propreTextReader
classe qui sert de proxy pour toutes les "normales" les appels vers un autreStringReader
, mais recrée proxy exemple, lorsqu'il en a besoin.Si c'est un
StreamReader
, et si ce cours d'eau prend en charge la recherche, puis:Cependant, ce n'est pas possible sur l'arbitraire
TextReader
s. Vous pourriez peut-être lire tous comme une chaîne de caractères, vous pouvez utiliserStringReader
à plusieurs reprises?TextReader
s...Je suis tombé sur votre post, et était plutôt diappointed que ce n'est pas possible. J'ai piraté quelque chose de rapide qui fonctionne: il suffit d'éviter les stringreader tout à fait:
C'est pas joli, et il utilise le code ASCII (qui était ce que je devais de toute façon). Notez qu'avec un codage différent cela ne fonctionne pas, comme vous allez le chercher le n-ième octet, qui n'a pas être égale à la n-ième caractère. Si vous avez besoin que vous pourriez faire quelque chose comme
comme UTF32 est la seule longueur fixe format unicode.
Vous pouvez maintenant faire
Cherchez et vous trouverez.
TextReader
est dérivé deStreamReader
.StreamReader
contient unBaseStream
propriété