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

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

class Sample {
  static void Main()
  {
    using (var stream = File.OpenWrite("sample.dat")) {
      // ストリームの書き込み位置を4バイト目に移動する
      stream.Position = 4;

      // 書き込むデータが格納されているバイト配列
      var buffer = new byte[8] {0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48};

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

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

      // bufferの4バイト分をstreamに書き込む
      stream.Write(buffer, 0, 4);
    }
  }
}

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)