はじめに
C#を使ったファイル操作では、テキストファイルの他にバイナリファイルを扱うことも多くあります。バイナリファイルは、画像や音声、動画データ、シリアライズされたオブジェクトなど、テキスト形式以外のデータを効率的に保存できる形式です。本記事では、C#を使用してバイナリファイルの読み書きを行う方法を、コード例と共に詳しく解説します。
バイナリファイル操作の基本クラス
バイナリファイルを操作するには、主に次の2つのクラスを使用します。
BinaryReader
: バイナリデータを読み込むためのクラス。BinaryWriter
: バイナリデータを書き込むためのクラス。
これらのクラスは、System.IO
名前空間に含まれており、ファイルやストリームに対してバイト単位の操作を行うことができます。
主なメソッドの一覧
クラス名 | 読み書きメソッド | 説明 |
---|---|---|
BinaryReader | ReadByte() , ReadInt32() , ReadString() |
バイトや数値、文字列などをバイナリ形式で読み取ります。 |
BinaryWriter | Write(byte) , Write(int) , Write(string) |
バイトや数値、文字列などをバイナリ形式で書き込みます。 |
バイナリファイルへの書き込み
バイナリデータを書き込むには、BinaryWriter
を使います。BinaryWriter
は、数値、文字列、ブール値などのさまざまな型をバイナリ形式でファイルに保存することができます。
BinaryWriterの基本的な使い方
以下のコードは、整数や文字列をバイナリファイルに書き込む例です。
using System; using System.IO; class Program { static void Main() { string filePath = @"C:\example\binaryfile.bin"; using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Create))) { // 整数、浮動小数点、文字列などを書き込む writer.Write(100); // int writer.Write(3.1415); // double writer.Write("こんにちは"); // string writer.Write(true); // bool Console.WriteLine("バイナリファイルに書き込みが完了しました。"); } } }
解説:
BinaryWriter
は、指定されたファイルに対してデータを書き込みます。File.Open
を使ってファイルを開き、FileMode.Create
を指定すると、ファイルが存在しない場合は新しく作成されます。既に存在する場合は上書きされます。Write
メソッドは、様々な型のデータを書き込むことができます。
バイナリファイルの読み込み
バイナリファイルからデータを読み込むには、BinaryReader
を使用します。BinaryReader
を使うことで、書き込んだデータをバイナリ形式で正しく読み取ることができます。
BinaryReaderの基本的な使い方
以下のコードは、上記で書き込んだバイナリデータを読み込む例です。
using System; using System.IO; class Program { static void Main() { string filePath = @"C:\example\binaryfile.bin"; if (File.Exists(filePath)) { using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open))) { // バイナリデータを読み込む int intValue = reader.ReadInt32(); double doubleValue = reader.ReadDouble(); string stringValue = reader.ReadString(); bool boolValue = reader.ReadBoolean(); Console.WriteLine("読み込んだデータ:"); Console.WriteLine($"int: {intValue}, double: {doubleValue}, string: {stringValue}, bool: {boolValue}"); } } else { Console.WriteLine("ファイルが存在しません。"); } } }
解説:
BinaryReader
を使用してバイナリデータを読み込むとき、Read
メソッドを使ってデータ型ごとに正確に読み取る必要があります。- 書き込み時と同じ順序でデータを読み込むことが重要です。順序が異なると、データの読み取りに失敗したり、不正な結果になることがあります。
バイナリファイルの部分的な読み書き
バイナリファイルは、テキストファイルと異なり、ファイル全体を扱うのではなく、部分的に読み書きすることができます。ファイルの特定の位置にデータを書き込んだり、読み込んだりすることが可能です。
ファイルポインタの移動
BinaryReader
やBinaryWriter
では、Seek
メソッドを使ってファイルポインタを任意の位置に移動させることができます。これにより、特定の場所にデータを書き込んだり、読み込んだりすることが可能です。
ファイルポインタを移動して書き込む例
using System; using System.IO; class Program { static void Main() { string filePath = @"C:\example\binaryfile.bin"; using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.OpenOrCreate))) { // ファイルの3バイト目から書き込む writer.Seek(2, SeekOrigin.Begin); writer.Write(999); Console.WriteLine("特定の位置にデータを書き込みました。"); } } }
ファイルポインタを移動して読み込む例
using System; using System.IO; class Program { static void Main() { string filePath = @"C:\example\binaryfile.bin"; using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open))) { // ファイルの3バイト目から読み込む reader.BaseStream.Seek(2, SeekOrigin.Begin); int value = reader.ReadInt32(); Console.WriteLine($"ファイルの3バイト目から読み込んだ値: {value}"); } } }
解説:
Seek
メソッドやBaseStream.Seek
を使うことで、ファイル内の任意の場所にアクセスできます。SeekOrigin.Begin
はファイルの先頭からのオフセットを指定しますが、他にもSeekOrigin.Current
やSeekOrigin.End
を使って、現在位置やファイルの末尾からのオフセットを指定できます。
バイナリファイル操作の注意点
バイナリファイルを操作する際には、いくつかの注意点があります。
- データ型の整合性: 読み書きする際には、データの型と順序を正確に一致させる必要があります。例えば、
int
を書き込んでおきながら、ReadString
で読み込もうとするとエラーが発生します。 - エンディアンの違い: 異なるプラットフォーム間でバイナリファイルを操作する場合、エンディアン(バイトオーダー)の違いに注意する必要があります。通常、C#の
BinaryReader
とBinaryWriter
はリトルエンディアンで動作します。 - ファイルの終端: バイナリファイルを読み込む際に、ファイルの終端を超えてデータを読み取ろうとすると、
EndOfStreamException
が発生するため、ストリームの長さに注意する必要があります。
まとめ
この記事では、C#を使ったバイナリファイルの読み書き方法について解説しました。BinaryReader
とBinaryWriter
を使用することで、さまざまなデータ型を効率的にバイナリ形式で保存し、読み取ることができます。また、ファイルの部分的な操作やファイルポインタの移動も可能です。これらの知識を活用することで、テキストファイルよりも複雑なデータを扱う
コメント