バイナリ・ファイルを簡単に読み書きするには?[2.0のみ、C#、VB]:.NET TIPS
バイナリ・ファイルを読み書きする際、単純にファイル全体をbyte配列に読み込んだり、byte配列全体をファイルに書き込んだりするだけなら、FileクラスのReadAllBytes/WriteAllBytesメソッドが便利だ。C#およびVBでの使い方を解説する。
「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) ' 書き込み
また、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
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
binsplit.vbのダウンロード
ReadAllBytesメソッドはファイル全体を一度に読み込むため、巨大なファイルを扱う場合には、読み込みにかかる時間や使用するメモリ量について注意が必要である。
利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:バイナリ・ファイル
使用ライブラリ:Fileクラス(System.IO名前空間)
関連TIPS:バイナリ・ファイルを読み書きするには?
Copyright© Digital Advantage Corp. All Rights Reserved.