|
.NET TIPS バイナリ・ファイルを読み書きするには?[C#、VB]デジタルアドバンテージ 遠藤 孝信2007/11/08 |
![]() |
|
|
|
バイナリ・ファイル(=テキスト・ファイル以外のファイル)を読み書きするには、FileStreamクラス(System.IO名前空間)を利用する。
FileStreamクラスはファイル用のストリームをサポートするクラスであり、Streamクラス(System.IO名前空間)の派生クラスの1つだ*。基本的には、コンストラクタで指定したファイルのストリームに対して、Seekメソッドにより読み書きを行う位置決めを行い、Readメソッド/Writeメソッドで読み書きを行う。
| * Streamクラスの派生クラスには、ほかに、 ・NetworkStreamクラス(System.Net.Sockets名前空間) ・MemoryStreamクラス(System.IO名前空間) ・BufferedStreamクラス(System.IO名前空間) ・GZipStreamクラス(System.IO.Compression名前空間) ・CryptoStreamクラス(System.Security.Cryptography名前空間) などがある。 |
ReadメソッドとWriteメソッド
FileStreamクラスのReadメソッドでは、パラメータとして、読み込んだデータを格納するためのbyte配列、読み込んだデータを書き込む(配列内の)位置、読み込むバイト数を指定する。
ファイルのどの位置のデータを読み込むかはReadメソッドでは指定しない。読み込みの開始位置はFileStreamオブジェクトによりストリームの「現在位置」として管理されており、これはReadメソッドを呼び出すたびに、読み込んだ分だけ先に進む。つまり、繰り返しReadメソッドを呼び出すことにより、順次データを読み込んでいけるというわけだ。
ファイルの任意の位置のデータを読み込むには、あらかじめSeekメソッドによりストリームの現在位置を移動させる。Seekメソッドの第1パラメータでは、現在位置を示すオフセットをlong型の値で指定する。第2パラメータでは、それが先頭あるいは末尾からのオフセットであるか、現在位置からのオフセットであるかをSeekOrigin列挙体(System.IO名前空間)の値により指定する。
Readメソッドの戻り値は、実際に読み込んだバイト数となる。ファイルの末尾付近では、この値は第3パラメータで指定した値(読み込むバイト数)よりも小さくなる可能性がある。また、ストリームの現在位置がファイルの末尾に達している場合には、Readメソッドの戻り値は0となる。
次のコードは、バイナリ・ファイル「test.bin」をオープンし、byte配列に1024bytesずつ読み込むサンプル・プログラムである。FileStreamクラスでは、Lengthプロパティによりオープンしているファイルのサイズを取得できる。
| |
| Readメソッドによりバイナリ・ファイルを読み込むC#のサンプル・プログラム(binread.cs) | |
| |
| Readメソッドによりバイナリ・ファイルを読み込むVBのサンプル・プログラム(binread.vb) | |
ここでは記述例を示すために1024bytesずつファイルを読み込んでいるが、(読み込むファイルのサイズが巨大でなければ)次のようにして全体を一度に読み込んでもよい。
readSize = fs.Read(buf, 0, fs.Length)
一方、バイナリ・データ(byte配列)をファイルに書き込むには、Writeメソッドを使用する。Writeメソッドのパラメータには、データが格納されているbyte配列、書き込むデータの配列内での位置、書き込むバイト数を指定する。Readメソッドと同様に、書き込む位置はストリームの現在位置となる(Writeメソッドと上述したSeekメソッドのコード例については、次のサンプル・プログラムを参照)。
読み込みエラーを無視してコピーを行うサンプル・プログラム
次のコードは、Read、Write、Seekメソッドを使用したサンプル・プログラムである。このプログラムでは、読み込み時のエラーを無視してコピーを行う(読み取れなかった部分は0で埋める)。
傷の付いたDVDなどを読もうとしたら、CRCエラーが出てしまったが、一部欠損していてもよいので、とにかくファイルをコピーしたいといった場合に利用できるプログラムだ。
| |
| 読み込みエラーを無視してコピーを行うC#のサンプル・プログラム(bincopy.cs) | |
| |
| 読み込みエラーを無視してコピーを行うVBのサンプル・プログラム(bincopy.vb) | |
プログラムでは、Readメソッドが失敗したときには(この場合には例外が発生する)、読み込み用のストリームをSeekメソッドにより進め、書き込み用のストリームには0を書き込む。FileStreamクラスのPositionプロパティはストリームの現在位置を表す。
なお、SeekメソッドはFileStreamオブジェクトが内部で管理する現在位置を移動するだけで、ファイルの読み込めない部分に現在位置を移動したとしても呼び出しは失敗しない。実際にエラーが発生するのは、その後にReadメソッドを呼び出した場合である。![]()
| 利用可能バージョン:.NET Framework 2.0のみ カテゴリ:クラス・ライブラリ 処理対象:バイナリ・ファイル 使用ライブラリ:FileStreamクラス(System.IO名前空間) 使用ライブラリ:SeekOrigin列挙体(System.IO名前空間) |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


