ストリーム内の現在位置を取得するにはPositionプロパティを参照します。 この値は、Readメソッド・Writeメソッドで読み書きを行う際の開始位置となります。 読み書きの両方が可能なストリームでも、読み込みと書き込みの開始位置は常に同じとなる(別々ではない)点に注意してください。
また、ストリームの長さを取得するにはLengthプロパティを参照します。
Streamの長さとStream内の現在位置を取得する
using System;
using System.IO;
class Sample {
static void Main()
{
using (var stream = File.OpenRead("sample.dat")) {
// streamの長さと現在の位置を表示
Console.WriteLine("Length : {0}", stream.Length);
Console.WriteLine("Position : {0}", stream.Position);
// streamからデータを読み込む
var buffer = new byte[8];
var len = stream.Read(buffer, 0, buffer.Length);
// 読み込めたバイト数と現在の位置を表示
Console.WriteLine("Read() : {0}", len);
Console.WriteLine("Position : {0}", stream.Position);
}
}
}
実行結果例
Length : 32 Position : 0 Read() : 8 Position : 8
現在位置の変更(シーク)を行うにはPositionプロパティに値を設定するか、Seekメソッドを使います。 また、ストリームの長さを変更するにはSetLengthメソッドを使います。
現在位置や長さを取得できないストリームに対してPosition・Lengthを参照しようとした場合、例外NotSupportedExceptionがスローされます。 例えば、NetworkStreamや標準入出力のストリームは長さや位置が取得できないストリームです。