🙌

C#でバイナリファイル読み書き

2022/10/30に公開

C#でバイナリファイル読み書き

C#でのバイナリファイル読み書き方法をまとめます。

バイナリファイル

バイナリファイルとはテキストファイル以外のファイルのことです。
例えば画像ファイル(jpeg, png, bmp 等)や動画ファイル(mp4, mov, wmv 等)、音楽ファイル(mp3, aac 等)があります。
バイナリファイルのデータはテキストファイルのように文字で読み書きすることはできませんが、16進数などの形で読み書きすることができます。

FileStreamクラス

バイナリファイルの読み書きにはFileStreamクラスを使用します。
コンストラクタで作成モード、読み書きアクセス許可を設定します。
テキストファイルを開く時と同様にusingを使用するようにしましょう。

FileStream(String file, System.IO.FileMode mode, System.IO.FileAccess access)
file   : 読み書きするファイル
mode   : 作成モード
access : 読み書きアクセス許可

作成モード(enum FileMode)

名称 説明
CreateNew 1 新しいファイルを作成します。ファイルが既に存在する場合は例外がスローされます。
Create 2 新しいファイルを作成します。ファイルが既に存在する場合は上書きします。
Open 3 既存のファイルを開きます。ファイルが存在しない場合は例外をスローします。
OpenOrCreate 4 ファイルが存在する場合はそのファイルを開き、存在しない場合は新しいファイルを作成します。
Truncate 5 既存のファイルを開き、ファイルのサイズが0バイトになるように切り詰めます。

読み書きアクセス許可(enum FileAccess)

名称 説明
Read 1 読み取りアクセス
Write 2 書き込みアクセス
ReadWrite 3 読み取り/書き込みアクセス

Readメソッド

ファイルからデータを読み込むにはReadメソッドを使用します。
Readメソッドはストリームの現在の位置からデータを読み込んでバイト配列に格納します。
読み込みに成功した場合、読み取った分だけストリームの位置を進めます。

int Read(byte[] readdata, int offset, int count)
readdata : ファイルから読み取ったデータを格納するバイト配列
offset   : readdataの読み取りデータ格納先インデックス
count    : 読み取る最大サイズ
return   : 実際に読み取ったデータサイズ
using (FileStream fs = new FileStream("binary.bin", FileMode.Create, FileAccess.ReadWrite))
{
    byte[] bufr = new byte[100];
    fs.Read(bufr, 0, 10);           // ファイルから10バイト読み込む。
                                    // 格納先はbufrのインデックス0~9。
}

Writeメソッド

ファイルにデータを書き込むにはWriteメソッドを使用します。
Writeメソッドはストリームの現在の位置にデータを書き込みます。
書き込みが成功した場合、書き込んだ分だけストリームの位置を進めます。

void Write(byte[] writedata, int offset, int count)
writedata : ファイルに書き込むデータを格納したバイト配列
offset    : writedataの書き込みデータ格納先インデックス
count     : 書き込む最大データ数
using (FileStream fs = new FileStream("binary.bin", FileMode.Create, FileAccess.ReadWrite))
{
    byte[] bufw = new byte[10] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9 };
    fs.Write(bufw, 0, 10);      // ファイルに10バイト書き込む。
                                // 書き込むデータはbufwのインデックス0~9に格納されているデータ。
}

Seekメソッド

ストリーム位置を移動させるにはSeekメソッドを使用します。

long Seek(long offset, System.IO.SeekOrigin origin)
offset : originに対する相対位置。
origin : シークの開始位置を指定する。
return : 新しいストリームの位置。

シーク開始位置(enum SeekOrigin)

名称 説明
Begin 0 ストリームの先頭
Current 1 ストリーム内の現在位置
End 2 ストリームの末尾
using (FileStream fs = new FileStream("binary.bin", FileMode.Create, FileAccess.ReadWrite))
{
    byte[] bufw = new byte[5] { 0x0, 0x1, 0x2, 0x3, 0x4 };
    byte[] bufr = new byte[5];

    fs.Write(bufw, 0, 5);           // 書き込んだ分ストリームの位置が進む。
    fs.Seek(0, SeekOrigin.Begin);   // ストリームの位置を先頭に戻す。
    fs.Read(bufr, 0, 5);            // 先頭から5バイト読み込む。
}

Discussion