.NET TIPS

バイナリ・ファイルを簡単に読み書きするには?[2.0のみ、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2007/11/15

 「TIPS:バイナリ・ファイルを読み書きするには?」では、FileStreamクラス(System.IO名前空間)を使用してバイナリ・ファイルを読み書きする方法について解説したが、単純にファイルの内容をすべてbyte配列に読み込む、あるいは逆に、byte配列全体をファイルに書き込むというだけであれば、より簡単な方法が用意されている(ただし.NET Framework 2.0以降)。

 これには、Fileクラス(System.IO名前空間)のReadAllBytesメソッド/WriteAllBytesメソッドを使用する。これらの静的メソッドでは、ファイルのオープン、byte配列への読み込み/byte配列の書き込み、ファイルのクローズという処理を1回のメソッド呼び出しで実行可能だ。

 ReadAllBytesメソッドでは、読み込むファイルのパス名をパラメータに指定して呼び出すと、戻り値としてファイルの内容を読み込んだbyte配列が返される。

byte[] data = File.ReadAllBytes("test.bin"); // 読み込み
File.WriteAllBytes("testnew.bin", data); // 書き込み
Dim data() As Byte = File.ReadAllBytes("test.bin") ' 読み込み
File.WriteAllBytes("testnew.bin", data) ' 書き込み
ReadAllBytesメソッド/WriteAllBytesメソッドの記述例(上:C#、下:VB)

 また、WriteAllBytesメソッドでは、書き込むファイルのパス名(すでにファイルが存在する場合には上書きされる)と、書き込むbyte配列をパラメータで指定する。戻り値はない。

バイナリ・ファイルを固定サイズで分割するサンプル・プログラム

 次のコードは、ReadAllBytesメソッドとWriteAllBytesメソッドを使用したサンプル・プログラムである。

 このプログラムでは、バイナリ・ファイルを読み込み、それを固定サイズ(1Mbytes)の複数ファイル(ファイル名はout0001.bin、out0002.bin、……)に分割して出力する。なお、出力される最後のファイルは固定サイズに満たない場合がある。

// binsplit.cs

using System;
using System.IO;

class BinarySplit {
  static void Main() {

    // バイナリ・ファイルの読み込み
    byte[] src = File.ReadAllBytes("test.bin");

    int FILESIZE = 1024 * 1000; // 分割サイズ

    int num = 0;
    for (int remain = src.Length; remain > 0; remain -= FILESIZE) {

      // 作成する分割ファイルの実際のサイズ
      int length = Math.Min(FILESIZE, remain);

      // 分割ファイルへ書き出すbyte配列の作成
      byte[] dest = new byte[length];
      Array.Copy(src, num * FILESIZE, dest, 0, length);

      // 出力ファイル名(out0001.bin、out0002.bin、……)
      string name = String.Format("out{0:D4}.bin", num + 1);

      // byte配列のファイルへの書き込み
      File.WriteAllBytes(name, dest);

      num++;
    }
  }
}

// コンパイル方法:csc binsplit.cs
バイナリ・ファイルを固定サイズで分割するC#のサンプル・プログラム(binsplit.cs)

' binsplit.vb

Imports System
Imports System.IO

Class BinarySplit
  Shared Sub Main()

    ' バイナリ・ファイルの読み込み
    Dim src() As Byte = File.ReadAllBytes("test.bin")

    Dim FILESIZE As Integer = 1024 * 1000 ' 分割サイズ

    Dim num As Integer = 0

    Dim remain As Integer = src.Length
    While remain > 0

      ' 作成する分割ファイルの実際のサイズ
      Dim length As Integer = Math.Min(FILESIZE, remain)

      ' 分割ファイルへ書き出すbyte配列の作成
      Dim dest(length - 1) As Byte
      Array.Copy(src, num * FILESIZE, dest, 0, length)

      ' 出力ファイル名(out0001.bin、out0002.bin、……)
      Dim name As String = String.Format("out{0:D4}.bin", num + 1)

      ' byte配列のファイルへの書き込み
      File.WriteAllBytes(name, dest)

      num += 1
      remain -= FILESIZE
    End While
  End Sub
End Class

' コンパイル方法:vbc binsplit.vb
バイナリ・ファイルを固定サイズで分割するVBのサンプル・プログラム(binsplit.vb)

 ReadAllBytesメソッドはファイル全体を一度に読み込むため、巨大なファイルを扱う場合には、読み込みにかかる時間や使用するメモリ量について注意が必要である。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:バイナリ・ファイル
使用ライブラリ:Fileクラス(System.IO名前空間)
関連TIPS:バイナリ・ファイルを読み書きするには?

この記事と関連性の高い別の.NET TIPS
バイナリ・ファイルを読み書きするには?
テキスト・ファイルの内容を読み込むには?
テキスト・ファイルの内容を簡単に書き込むには?
オープン中のファイルにアクセスするには?
ファイルをコピー/削除/リネーム/移動するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

キャリアアップ


- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る
- PR -

ホワイトペーパーTechTargetジャパン

ソリューションFLASH

「ITmedia マーケティング」新着記事

目立つ! 読まれる! ブログを作る4つのポイント
ブランドの認知度向上に向けて、ブログを活用している企業は多い。だが実際、あまたのブ...

VOYAGE GROUP、東京工業大学と産学連携 ―― アドテクノロジー分野のビッグデータ活用を共同研究
VOYAGE GROUPは4月17日、東京工業大学と産学連携し、アドテクノロジー分野におけるビッグ...

日本のメディアが進む道 ―― 朝日新聞メディアラボ、東洋経済オンライン、NHKのメディア戦略から読み解く
メディアは生き残れるのかといった議論が活発な昨今。テレビや新聞、雑誌などのマスメデ...