- PR -

FileStream の Position について

1
投稿者投稿内容
まかろに
常連さん
会議室デビュー日: 2005/06/17
投稿数: 41
投稿日時: 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


甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-11-08 00:30
ReadLineで読み取った文字数を自分で累計すれば、望んでいることを実現できるでしょう。

Positionの返す値とReadLineの返す現在の読取位置が一致しないのは、StreamReaderがバッファにまとめて読み込んだ後、それを解析する実装になっているためです。処理を高速にするための仕様ですので、如何ともし難いです。この事はBaseStreamプロパティの説明にも簡単に書かれています。

これが如何しても気に入らないなら、自前で必要な機能を持つクラスを実装してください。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-08 00:33
引用:

まかろにさんの書き込み (2005-11-07 22:57) より:

ヒットした時に、StreamReader のベースになってる FileStream


StreamReader の基底は、System.IO.TextReader クラスだと思いますが...
コンストラクタで指定した FileStream という解釈でしょうか?

引用:

Position とRegex.Match の Index を使えばできるかと思っていたのですが
この Position の値が1ライン読んだだけで"1024"となってしまい
以降もずっと1024のまま変化しません。
試しに、Read() や Seek() 等でやってみたのですが、同じ結果でした。


正しくは FileStream の Read メソッドを使います。
おそらく、StreamReader の Read メソッドを使ったのでしょう。

ちなみに、何のために、
 「正規表現で検索をかけ、ヒットした位置にストリームをもっていく」
をやられているのでしょうか?
ファイルに対して行うのはレスポンスがよろしくないと思うのですが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まかろに
常連さん
会議室デビュー日: 2005/06/17
投稿数: 41
投稿日時: 2005-11-10 00:13
>甕星さん
なるほど、パフォーマンス重視のための仕様でしたか・・・納得です。

>じゃんぬねっとさん

引用:


じゃんぬねっとさんの書き込み (2005-11-08 00:33) より:
StreamReader の基底は、System.IO.TextReader クラスだと思いますが...
コンストラクタで指定した FileStream という解釈でしょうか?


StreamReader のメンバにある BaseStream というつもりで
書いてみました。紛らわしかったですね・・・すいません

引用:


正しくは FileStream の Read メソッドを使います。
おそらく、StreamReader の Read メソッドを使ったのでしょう。

ちなみに、何のために、
 「正規表現で検索をかけ、ヒットした位置にストリームをもっていく」
をやられているのでしょうか?
ファイルに対して行うのはレスポンスがよろしくないと思うのですが...



この時点で検索をかけるのは確かにパフォーマンス的によろしくないですね。
というよりあまり意味がないですね・・・
もうちょっと設計の方を考え直してみます。

貴重なご意見ありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)