*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

<C# 4.0以降>
「メモリマップドファイルで記憶媒体をファイルにする場合」のコード No.4


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

.






元のページ


元ページ「<C# 4.0以降> メモリマップドファイルで記憶媒体をファイルにする場合」
http://note.chiebukuro.yahoo.co.jp/detail/n178767

 

記述量上限の制限で、ページを分けて記述しています。




本ページの前のページ


「メモリマップドファイルで記憶媒体をファイルにする場合」のコード No.3

http://note.chiebukuro.yahoo.co.jp/detail/n178916

 

記述量上限の制限で、ページを分けて記述しています。







本ページの次のページ


「メモリマップドファイルで記憶媒体をファイルにする場合」のコード No.5

http://note.chiebukuro.yahoo.co.jp/detail/n178918

 

記述量上限の制限で、ページを分けて記述しています。








はじめに


元ページの「<C# 4.0以降> メモリマップドファイルで記憶媒体をファイルにする場合」におけるコードをここに記述します。








マップビューアクセスクラスのコード



 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


// <C# 4.0以降> メモリマップドファイルで記憶媒体をファイルにする場合
namespace SharedMemory4_File
{


    // ************************************
    // マップビューアクセスクラス
    // ************************************
    public partial class MappViewController
    {

 

        // ==============
        // string型データー取得メソッド < 可変長 >
        // string型データーを、メモリマップドファイルによるメモリ領域から
        // 取得する。
        // 第1引数: 読み込み開始位置 (バイト数)
        //           入力時: 読み込みを行う先頭部のインデックス
        //           出力時: 読み込んだデーターの末尾部のインデックスの、
        //                   さらに次のインデックス(すなわち、次回の読
        //                   み込み時の先頭インデックス)
        // 第2引数: 変換前のエンコードを入力指定(シフトJISコード時は、"shift_jis")
        // 戻り値: 取得データー
        public string GetStringData(
            ref int Read_Position,
            string BeforeEncod)
        {

            // 文字列データー(バイト型配列)のサイズ(単位はバイトでのサイズ)
            int ByteSizeOfStringData;


            // 文字列データー(バイト型配列)のサイズを取得
            ByteSizeOfStringData = GetInt32Data(
                ref Read_Position);


            //-------
            // 文字列データー(バイト型配列)を取得


            // string型データー用バイト型配列
            // 後にstring型のデーターを、バイト型配列に格納する時に使う。
            Byte[] ByteArray = new Byte[ByteSizeOfStringData];


            // マップビューオープン
            using (System.IO.MemoryMappedFiles.MemoryMappedViewAccessor accessor = SMemory.mmf.CreateViewAccessor())
            {

                // メモリ領域からデーター値(バイト型配列)を取得するループ
                for (int i = 0; i < ByteSizeOfStringData; i++)
                {
                    ByteArray[i] = accessor.ReadByte(Read_Position + i);
                }

            }


            // 次のデーターを取得する時のために、インデックスを移動
            Read_Position += ByteSizeOfStringData;


            //-------
            // 取得したデーターをバイト型配列からstring型に変換
            // (バイト型配列 ---> ユニコードstring 変換)
            string data;
            StringBytesController.ChangeBinaryToUnicodeStr(
                ByteArray,
                BeforeEncod,
                out data);


            // 取得したデーター値(string型)を返却
            return data;

        }

 

        // ==============
        // string型データー取得メソッド < 固定長 >
        // string型データーを、メモリマップドファイルによるメモリ領域から
        // 取得する。
        // 第1引数: 読み込み開始位置 (バイト数)
        //           入力時: 読み込みを行う先頭部のインデックス
        //           出力時: 読み込んだデーターの末尾部のインデックスの、
        //                   さらに次のインデックス(すなわち、次回の読
        //                   み込み時の先頭インデックス)
        // 第2引数: 変換前のエンコードを入力指定(シフトJISコード時は、"shift_jis")
        // 第3引数: 文字列データーのサイズ(単位はバイトでのサイズ)
        // 戻り値: 取得データー
        public string GetFixedLengthString(
            ref int Read_Position,
            string BeforeEncod,
            int ByteSizeOfStringData)
        {

            // string型データー用バイト型配列
            // 後にstring型のデーターを、バイト型配列に格納する時に使う。
            Byte[] ByteArray = new Byte[ByteSizeOfStringData];


            // マップビューオープン
            using (System.IO.MemoryMappedFiles.MemoryMappedViewAccessor accessor = SMemory.mmf.CreateViewAccessor())
            {

                // メモリ領域からデーター値(バイト型配列)を取得するループ
                for (int i = 0; i < ByteSizeOfStringData; i++)
                {
                    ByteArray[i] = accessor.ReadByte(Read_Position + i);
                }

            }


            // 次のデーターを取得する時のために、インデックスを移動
            Read_Position += ByteSizeOfStringData;


            // 取得したデーターをバイト型配列からstring型に変換
            // (バイト型配列 ---> ユニコードstring 変換)
            string data;
            StringBytesController.ChangeBinaryToUnicodeStr(
                ByteArray,
                BeforeEncod,
                out data);


            // 取得したデーター値(string型)を返却
            return data;

        }

 

        // ==============
        // Int32型データー取得メソッド
        // Int32型データーを、メモリマップドファイルによるメモリ領域から
        // 取得する。
        // 第1引数: 読み込み開始位置 (バイト数)
        //           入力時: 読み込みを行う先頭部のインデックス
        //           出力時: 読み込んだデーターの末尾部のインデックスの、
        //                   さらに次のインデックス(すなわち、次回の読
        //                   み込み時の先頭インデックス)
        // 戻り値: 取得データー
        public Int32 GetInt32Data(
            ref int Read_Position)
        {

            // Int32型のデーターのサイズ(Int32型サイズ)
            int Int32_Size = sizeof(Int32);


            // Int32型データー用バイト型配列
            // 後にInt32型データーを、バイト型配列に格納する時に使う。
            Byte[] Int32Bytes = new Byte[Int32_Size];

 

            // マップビューオープン
            using (System.IO.MemoryMappedFiles.MemoryMappedViewAccessor accessor = SMemory.mmf.CreateViewAccessor())
            {

                // メモリ領域からデーター値(バイト型配列)を取得するループ
                for (int i = 0; i < Int32_Size; i++)
                {
                    Int32Bytes[i] = accessor.ReadByte(Read_Position + i);
                }

            }


            // 次のデーターを取得する時のために、インデックスを移動
            Read_Position += Int32_Size;


            // 取得したデーターをバイト型配列からInt32型に変換
            Int32 data = BitConverter.ToInt32(Int32Bytes, 0);


            // 取得したデーター値(Int32型)を返却
            return data;
        }

 

        // ==============
        // double型データー取得メソッド
        // double型データーを、メモリマップドファイルによるメモリ領域から
        // 取得する。
        // 第1引数: 読み込み開始位置 (バイト数)
        //           入力時: 読み込みを行う先頭部のインデックス
        //           出力時: 読み込んだデーターの末尾部のインデックスの、
        //                   さらに次のインデックス(すなわち、次回の読
        //                   み込み時の先頭インデックス)
        // 戻り値: 取得データー
        public double GetDoubleData(
            ref int Read_Position)
        {

            // double型のデーターのサイズ(double型サイズ)
            int Double_Size = sizeof(double);


            // double型データー用バイト型配列
            // 後にdouble型データーを、バイト型配列に格納する時に使う。
            Byte[] DoubleBytes = new Byte[Double_Size];

 

            // マップビューオープン
            using (System.IO.MemoryMappedFiles.MemoryMappedViewAccessor accessor = SMemory.mmf.CreateViewAccessor())
            {

                // メモリ領域からデーター値(バイト型配列)を取得するループ
                for (int i = 0; i < Double_Size; i++)
                {
                    DoubleBytes[i] = accessor.ReadByte(Read_Position + i);
                }

            }


            // 次のデーターを取得する時のために、インデックスを移動
            Read_Position += Double_Size;


            // 取得したデーターをバイト型配列からdouble型に変換
            double data = BitConverter.ToDouble(DoubleBytes, 0);


            // 取得したデーター値(double型)を返却
            return data;
        }

 


        // ==============
        // float型データー取得メソッド
        // float型データーを、メモリマップドファイルによるメモリ領域から
        // 取得する。
        // 第1引数: 読み込み開始位置 (バイト数)
        //           入力時: 読み込みを行う先頭部のインデックス
        //           出力時: 読み込んだデーターの末尾部のインデックスの、
        //                   さらに次のインデックス(すなわち、次回の読
        //                   み込み時の先頭インデックス)
        // 戻り値: 取得データー
        public float GetFloatData(
            ref int Read_Position)
        {

            // Int32型のデーターのサイズ(float型サイズ)
            int Float_Size = sizeof(float);


            // Int32型データー用バイト型配列
            // 後にInt32型データーを、バイト型配列に格納する時に使う。
            Byte[] FloatBytes = new Byte[Float_Size];


            // マップビューオープン
            using (System.IO.MemoryMappedFiles.MemoryMappedViewAccessor accessor = SMemory.mmf.CreateViewAccessor())
            {

                // メモリ領域からデーター値(バイト型配列)を取得するループ
                for (int i = 0; i < Float_Size; i++)
                {
                    FloatBytes[i] = accessor.ReadByte(Read_Position + i);
                }

            }


            // 次のデーターを取得する時のために、インデックスを移動
            Read_Position += Float_Size;


            // 取得したデーターをバイト型配列からfloat型に変換
            float data = BitConverter.ToSingle(FloatBytes, 0);


            // 取得したデーター値(float型)を返却
            return data;
        }

 

 

        // ==============
        // Int32型配列データー取得メソッド < 可変長 >
        // Int32型配列を、メモリマップドファイルによるメモリ領域から
        // 取得する。
        // 第1引数: 読み込み開始位置 (バイト数)
        //           入力時: 読み込みを行う先頭部のインデックス
        //           出力時: 読み込んだデーターの末尾部のインデックスの、
        //                   さらに次のインデックス(すなわち、次回の読
        //                   み込み時の先頭インデックス)
        // 戻り値: 取得データー
        public Int32[] GetInt32Array(
            ref int Read_Position)
        {

            // 配列データーのサイズ(単位はバイトでのサイズ)
            int ByteSizeOfArrayData;


            // 配列データーのサイズを取得
            ByteSizeOfArrayData = GetInt32Data(
                ref Read_Position);


            // 配列データーを取得
            Int32[] ArrayData = GetInt32FixedLengthArray(
                ref Read_Position,
                ByteSizeOfArrayData);


            // 取得したデーター値(Int32型配列)を返却
            return ArrayData;

        }

 

        // ==============
        // Int32型配列データー取得メソッド < 固定長 >
        // Int32型配列を、メモリマップドファイルによるメモリ領域から
        // 取得する。
        // 第1引数: 読み込み開始位置 (バイト数)
        //           入力時: 読み込みを行う先頭部のインデックス
        //           出力時: 読み込んだデーターの末尾部のインデックスの、
        //                   さらに次のインデックス(すなわち、次回の読
        //                   み込み時の先頭インデックス)
        // 第2引数: 配列データーのサイズ(単位はバイトでのサイズ)
        // 戻り値: 取得データー
        public Int32[] GetInt32FixedLengthArray(
            ref int Read_Position,
            int ByteSizeOfArrayData)
        {

            // 配列要素数の取得
            int ElementsNumber = ByteSizeOfArrayData / sizeof(Int32);


            // 取得データーを格納するための配列
            Int32[] ArrayData = new Int32[ElementsNumber];


            // メモリ領域からデーター値(バイト型配列)を取得するループ
            for (int i = 0; i < ElementsNumber; i++)
            {
                // Int32型データー取得
                ArrayData[i] = GetInt32Data(
                    ref Read_Position);
            }


            // 取得したデーター値(Int32型配列)を返却
            return ArrayData;

        }


    }
}



さいごに


本ページの内容説明については、元ページを参照して下さい。