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の二つを指定します。 originはSeekOrigin列挙体で指定し、その値によってoffsetの意味が次のように変わります。 また、offsetには負の値を指定することもできます。
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) |