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

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

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

Class Sample
  Shared Sub Main()
    Using stream As Stream = File.OpenRead("sample.dat")
      ' streamの長さと現在の位置を表示
      Console.WriteLine("Length : {0}", stream.Length)
      Console.WriteLine("Position : {0}", stream.Position)

      ' streamからデータを読み込む
      Dim buffer(7) As Byte

      Dim len As Integer = stream.Read(buffer, 0, buffer.Length)

      ' 読み込めたバイト数と現在の位置を表示
      Console.WriteLine("Read() : {0}", len)
      Console.WriteLine("Position : {0}", stream.Position)
    End Using
  End Sub
End Class
実行結果例
Length : 32
Position : 0
Read() : 8
Position : 8

現在位置の変更(シーク)を行うにはPositionプロパティに値を設定するか、Seekメソッドを使います。 また、ストリームの長さを変更するにはSetLengthメソッドを使います。

現在位置や長さを取得できないストリームに対してPosition・Lengthを参照しようとした場合、例外NotSupportedExceptionがスローされます。 例えば、NetworkStreamや標準入出力のストリームは長さや位置が取得できないストリームです。

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。