Positionプロパティはストリーム内における現在の読み込み・書き込み位置を取得するためのプロパティですが、ランダムアクセスをサポートするストリームではPositionプロパティに値を設定することでその位置にシークすることができます。

Positionプロパティに値を設定してStreamをシークする
Imports System
Imports System.IO

Class Sample
  Shared Sub Main()
    Using stream As Stream = File.OpenWrite("sample.dat")
      ' ストリームの書き込み位置を4バイト目に移動する
      stream.Position = 4

      ' 書き込むデータが格納されているバイト配列
      Dim buffer() As Byte = New Byte(7) {&h41, &h42, &h43, &h44, &h45, &h46, &h47, &h48}

      ' bufferの8バイト分をstreamに書き込む
      stream.Write(buffer, 0, 8)

      ' ストリームの書き込み位置を0バイト目(ストリームの先頭)に移動する
      stream.Position = 0

      ' bufferの4バイト分をstreamに書き込む
      stream.Write(buffer, 0, 4)
    End Using
  End Sub
End Class

Seekメソッドを使うことでもシークを行うことができます。 Seekメソッドでは、シーク先のオフセットoffsetとシークの原点originの二つを指定します。 originSeekOrigin列挙体で指定し、その値によってoffsetの意味が次のように変わります。 また、offsetには負の値を指定することもできます。

SeekOriginとSeekメソッドの移動結果の違い
SeekOrigin 意味 指定例
SeekOrigin.Begin ストリームの先頭からoffset進めた位置にシークする
(Position = offset)
ストリームの先頭にシークする場合
Seek(0, SeekOrigin.Begin)

ストリームの先頭から4バイト目にシークする場合
Seek(4, SeekOrigin.Begin)
SeekOrigin.Current ストリーム内の現在の読み込み・書き込み位置からoffset進めた位置にシークする
(Position = Position + offset)
現在位置から8バイト後方にシークする場合
Seek(8, SeekOrigin.Current)

現在位置から8バイト前方にシークする場合
Seek(-8, SeekOrigin.Current)
SeekOrigin.End ストリームの終端からoffset進めた位置にシークする
(Position = Length + offset)
ストリームの末尾にシークする場合
Seek(0, SeekOrigin.End)

ストリームの末尾から4バイト手前にシークする場合
Seek(-4, SeekOrigin.End)