ストリーム内の現在位置を取得するにはPositionプロパティを参照します。 この値は、ReadメソッドWriteメソッドで読み書きを行う際の開始位置となります。 読み書きの両方が可能なストリームでも、読み込みと書き込みの開始位置は常に同じとなる(別々ではない)点に注意してください。

また、ストリームの長さを取得するにはLengthプロパティを参照します。

Streamの長さとStream内の現在位置を取得する
using System;
using System.IO;

class Sample {
  static void Main()
  {
    using (Stream stream = File.OpenRead("sample.dat")) {
      // streamの長さと現在の位置を表示
      Console.WriteLine("Length : {0}", stream.Length);
      Console.WriteLine("Position : {0}", stream.Position);

      // streamからデータを読み込む
      byte[] buffer = new byte[8];

      int 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や標準入出力のストリームは長さや位置が取得できないストリームです。