[C# サンプル] バイナリファイルの内容をbyte型配列に読み込む

System.IO.FileStreamクラスを使うとファイルをバイナリ形式で読み込むことができます。ファイルの内容を1byteずつ、またはbyte配列に指定した範囲で読み込むことができます。

スポンサーリンク

byte型配列にバイナリファイルの内容を読み込む

System.IO.FileStreamクラスインスタンスReadメソッドを使うとbyte型配列にファイルの内容を読み込むことが出来ます。

FileStreamクラスのインスタンスを作成するにはSystem.IO.File.OpenReadメソッドを使います。このメソッドは引数で指定されたファイルを読み取り専用で開いたあとFileStreamクラスのインスタンスを返します。その後で作成したインスタンスのReadメソッドでファイルの内容をbyte型配列に代入します。
Readメソッドの第1引数には、内容をセットするbyte型配列
第2引数には読込開始位置(0が先頭)、
第3引数には読込終了位置(末尾までのサイズはLengthプロパティで取得できる)
を指定します。

using System;
using System.IO;
using System.Linq;
class Program
{
    public static void Main()
    {
        // 読み込むファイルのパス
        string filePath = @"D:\test.exe";
        // FileStreamのインスタンスを作成(usingについては記事後述)
        using var fs = File.OpenRead(filePath);

        // ファイルの内容を入れるbyte配列を用意
        byte[] bytes = new byte[fs.Length];
        // バイナリファイルの読込 先頭(0)から末尾(fs.Length)まで
        fs.Read(bytes, 0, (int)fs.Length);

        // ファイルサイズの表示(先頭から末尾まで読込したのでファイルサイズと同じになる)
        Console.WriteLine($"byte型配列の要素数={bytes.Length}");
        // 先頭4バイトを表示(byteは0~255の数値)
        Console.WriteLine(string.Join(" ", bytes[0..4]));
        // 先頭4バイトを16進数で表示
        Console.WriteLine(string.Join(" ", bytes[0..4].Select(b => b.ToString("X2"))));
    }
}

出力結果はこんな感じです。

byte型配列の要素数=171520
77 90 144 0
4D 5A 90 00
スポンサーリンク

using構文について

本来であればC#でファイルを扱う場合には、ファイルをOpenした後にCloseしないとプログラム実行中はずっとファイルを開いたままの状態になってしまい、他のプログラムから読み書きができなくなってしまうのですが、usingキーワードを変数宣言の前に付けると、その変数が宣言されたブロック内{ } を抜けたあとに自動で後始末(この場合はClose)をしてくれるようになります。

usingキーワードはIDisposableインターフェースを実装しているクラスに対して使うことができます。Closeメソッドを持っているクラスはたいていこのインターフェースを実装しているはずです。

上記のサンプル11行目「using var fs = …」のような書き方はC#8.0から書けるようになりました。それ以前の書き方の場合は、using (変数) { } のような書き方でusingブロックを抜けると自動で後始末処理が実行されます。

using System;
using System.IO;
using System.Linq;
class Program
{
    public static void Main()
    {
        // 読み込むファイルのパス
        string filePath = @"D:\test.exe";
        // FileStreamのインスタンスを作成
        using (var fs = File.OpenRead(filePath))
        {
            // ファイルの内容を入れるbyte配列を用意
            byte[] bytes = new byte[fs.Length];
            // バイナリファイルの読込 先頭(0)から末尾(fs.Length)まで
            fs.Read(bytes, 0, (int)fs.Length);
            // 先頭4バイトを表示(byteは0~255の数値)
            Console.WriteLine(string.Join(" ", bytes.Take(4)));
        } // ここで後始末(Close)の処理が実行される
    }
}

C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました