画像データや通信パケット、あるいは独自のバイナリ形式など、byte[](バイト配列)のデータをファイルとして保存する場合、FileStream クラスを使用することで柔軟な書き込み処理が可能になります。
単にすべてのバイトを書き込むだけであれば File.WriteAllBytes という簡易メソッドもありますが、FileStream.Write を使用すると、「配列の途中から書き込む」「既存のファイルを開いたまま追記する」「バッファリングしながら書き込む」といった細かな制御が可能になります。
目次
実装サンプル:設定データのバイナリ保存
以下のコードでは、アプリケーションの設定情報を文字列として用意し、それをバイトデータに変換した上で、ファイルストリームを使用して保存しています。
サンプルコード
using System;
using System.IO;
using System.Text;
public class Program
{
public static void Main()
{
// 保存先のファイルパス
string outputFile = "app_config.dat";
// 書き込みたいデータ(ここでは設定情報の文字列を想定)
string configData = "Version=1.0;Mode=Secure;MaxUsers=100;";
// 文字列をバイト配列に変換 (UTF-8)
byte[] dataBuffer = Encoding.UTF8.GetBytes(configData);
Console.WriteLine($"書き込みデータサイズ: {dataBuffer.Length} bytes");
// FileStreamを使用してファイルを開く(または作成する)
// FileMode.Create: ファイルがなければ作成、あれば上書き(0バイトから再作成)
// FileAccess.Write: 書き込み権限のみで開く
using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
{
// バイト配列の内容をファイルに書き込む
// Write(バッファ, 配列内の開始位置, 書き込む長さ)
fs.Write(dataBuffer, 0, dataBuffer.Length);
}
Console.WriteLine($"ファイルへの保存が完了しました: {outputFile}");
// (確認用) 正しく書き込まれたか読み出して表示
if (File.Exists(outputFile))
{
string loadedText = File.ReadAllText(outputFile, Encoding.UTF8);
Console.WriteLine($"\n[確認] ファイル内容: {loadedText}");
}
}
}
実行結果
書き込みデータサイズ: 36 bytes
ファイルへの保存が完了しました: app_config.dat
[確認] ファイル内容: Version=1.0;Mode=Secure;MaxUsers=100;
解説と技術的なポイント
1. FileStream.Write メソッド
public void Write(byte[] buffer, int offset, int count)
- buffer: 書き込むデータが入ったバイト配列。
- offset: 配列の「何番目の要素」から書き込みを始めるか(0なら先頭から)。
- count: 書き込むバイト数。
例えば、「配列の先頭10バイトはヘッダーなのでスキップし、残りを書き込みたい」といった場合に、offset を指定することで配列のコピーを作らずに効率よく書き込むことができます。
2. FileMode の選択
FileStream のコンストラクタで指定する FileMode によって、ファイルの扱いが変わります。
FileMode.Create: 新規作成。同名ファイルがあれば上書き(中身は空になる)します。FileMode.CreateNew: 新規作成。同名ファイルがあると例外(エラー)が発生します。FileMode.Append: 既存のファイルの末尾に追記します(ファイルがなければ作成)。
用途に合わせて適切なモードを選択することが重要です。
