FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

バイナリーファイルへのランダムアクセス

 バイナリーファイルへランダムアクセスする場合はBinaryWriterとBinaryReaderは使用しません。
 BinaryReaderにはランダムアクセスするためのメソッドが用意されていませんし、BinaryWriterを使用した場合、構造化データを含むためか、ランダムアクセスした際に正しくデータを読み取れません。
 ランダムアクセスを行いたい場合はFileStreamを使用してバイナリーファイルの読み書きを行います。
using System;
using System.IO;
using System.Text;

namespace RondomAccess
{
    class Program
    {
        static void Main(string[] args)
        {
            var filePath = "バイナリーファイルのパス";

            CreateBinaryFile(filePath);
            ReadRondomAccess(filePath);

            Console.ReadLine();
        }

        static void CreateBinaryFile(string filePath)
        {
            using(var writer = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                // 書き込むデータ
                var data1 = "ABCDEF";
                var data2 = 12345;

                // byteに変換
                var data1Bytes = Encoding.UTF8.GetBytes(data1);
                var data2Bytes = BitConverter.GetBytes(data2);

                // バイナリーファイルに書き込む
                writer.Write(data1Bytes, 0, data1Bytes.Length);
                writer.Write(data2Bytes, 0, data2Bytes.Length);
            }
        }

        static void ReadRondomAccess(string filePath)
        {
            using(var reader = new FileStream(filePath,FileMode.Open, FileAccess.Read))
            {
                // 4文字目から3文字分読み取る
                var offset = 3; // 0から始まるので
                var length1 = 3;

                // 読み取る位置まで移動する
                reader.Seek(offset, SeekOrigin.Begin);

                // 読み取り
                var buffer1 = new byte[length1];
                reader.Read(buffer1, 0, length1);

                // 文字列に変換して出力
                var read1 = Encoding.UTF8.GetString(buffer1);
                Console.WriteLine(read1);

                // 次のデータ(int型)を読み取る
                var length2 = 4;
                var buffer2 = new byte[length2];
                reader.Read(buffer2, 0, length2);
                var read2 = BitConverter.ToInt32(buffer2, 0);
                Console.WriteLine(read2);
            }
        }
    }
}
 バイナリーファイルを作成する場合は、FileStreamのコンストラクタでFileMode.Create、FileAccess.Writeを指定します。
 ファイルに書き込む際にはbyte型に変換する必要があります。
 文字列の場合はEncodingクラスを使用して、int型等の場合はBitConverterクラスを使用してbyte配列に変換します。
 ファイルに書き込む際にはWriteメソッドを使用します。
 第1引数に書き込むデータが格納されているbyte配列を指定します。
 第2引数にはbyte配列(第1引数の配列)のオフセット値を指定します。0の場合は配列の最初のデータから使用します。
 第3引数には書き込むデータサイズを指定します。ここでは配列の中身を全て書き込みたいので配列長を指定しています。

 次に、バイナリーファイルの読み込みです。
 読み込みの時もFileStreamを使用します。コンストラクタでFileMode.Open, FileAccess.Readを指定します。
 ランダムアクセスを行う場合は、Seekメソッドを使用して読み取りたいデータがある場所まで移動します。
 Seekメソッドの第1引数には移動量を、第2引数には移動する際の始点を指定します。
 このサンプルコードではSeekOrigin.Beginを指定しているので、始点はファイルの開始点となります。
 目的の場所まで移動したら指定サイズ分のデータを読み取ります。
 データの入れ物を用意しておき、Readメソッドでデータを読み取ります。
 第1引数にはデータを格納する配列を指定します。
 第2引数には配列のどこからデータを入れるかを指定します。最初の位置から格納してほしいので0を指定しています。
 第3引数には読み取るデータサイズを指定します。
 読み取ったデータはbyte配列なので、データの型を変換する必要があります。
 最初に読み取ったデータは文字列なので、Encodingクラスを使用して文字列に変換しています。
 Readメソッドを使用してデータを読み取った場合、自動的に読み取ったデータの終わりの位置まで移動しています。
 そのため、次にReadメソッドを呼んだ場合は先ほど読み取ったデータの次から指定したサイズのデータが読み取られます。
 このサンプルコードを実行すると以下の様になります。
バイナリーファイルのランダムアクセス
 FileStreamでのバイナリーファイル操作は見ての通り、型の変換や読み書きするデータサイズの指定など色々面倒な作業が必要になります。
 ランダムアクセスする必要がない場合はBinaryWriter, BinaryReaderを使用したほうが簡単です。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
全記事表示リンク

全ての記事を表示する

カテゴリ
タグリスト

月別アーカイブ
11  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09 
最新記事
リンク
最新コメント
検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。