- - PR -
FileStream の Position について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-07 22:57
いつもお世話になっております。
C# の FileStream に関しての質問です。 やろうとしていることは、テキストファイル操作用に FileStream から StreamReader を作成し、ReadLine() で1ラインずつ読み込みながら 正規表現で検索をかけ、ヒットした位置にストリームをもっていく というものです。 ヒットした時に、StreamReader のベースになってる FileStream の Position とRegex.Match の Index を使えばできるかと思っていたのですが この Position の値が1ライン読んだだけで"1024"となってしまい 以降もずっと1024のまま変化しません。 試しに、Read() や Seek() 等でやってみたのですが、同じ結果でした。 ( ちなみに、読み込もうとしているファイルサイズは2880バイトぐらいです ) こういう場合のストリームの正確な位置を取得するには どのようにすればいいのでしょうか? よろしくお願い致します。 [開発環境] Windows XP Visual Studio .NET2003 | ||||||||
|
投稿日時: 2005-11-08 00:30
ReadLineで読み取った文字数を自分で累計すれば、望んでいることを実現できるでしょう。
Positionの返す値とReadLineの返す現在の読取位置が一致しないのは、StreamReaderがバッファにまとめて読み込んだ後、それを解析する実装になっているためです。処理を高速にするための仕様ですので、如何ともし難いです。この事はBaseStreamプロパティの説明にも簡単に書かれています。 これが如何しても気に入らないなら、自前で必要な機能を持つクラスを実装してください。 | ||||||||
|
投稿日時: 2005-11-08 00:33
StreamReader の基底は、System.IO.TextReader クラスだと思いますが... コンストラクタで指定した FileStream という解釈でしょうか?
正しくは FileStream の Read メソッドを使います。 おそらく、StreamReader の Read メソッドを使ったのでしょう。 ちなみに、何のために、 「正規表現で検索をかけ、ヒットした位置にストリームをもっていく」 をやられているのでしょうか? ファイルに対して行うのはレスポンスがよろしくないと思うのですが... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-11-10 00:13
>甕星さん
なるほど、パフォーマンス重視のための仕様でしたか・・・納得です。 >じゃんぬねっとさん
StreamReader のメンバにある BaseStream というつもりで 書いてみました。紛らわしかったですね・・・すいません
この時点で検索をかけるのは確かにパフォーマンス的によろしくないですね。 というよりあまり意味がないですね・・・ もうちょっと設計の方を考え直してみます。 貴重なご意見ありがとうございました。 |
1