プログラミングのメモ

プログラミングの学び直し備忘録

INIファイル

INIファイル処理定義

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

using System.Runtime.InteropServices;

namespace INI.IniFiles
{
    /* 参考:INIファイルを読み書きするには?
     * https://www.atmarkit.co.jp/fdotnet/dotnettips/039inifile/inifile.html
     */
    class IniFiles
    {
        [DllImport("KERNEL32.DLL")]
        private static extern 
            uint GetPrivateProfileString(
                                        string lpAppName,
                                        string lpKeyName,
                                        string lpDefault,
                                        StringBuilder lpReturnedString,
                                        uint nSize,
                                        string lpFileName
                                        );

        [DllImport("KERNEL32.DLL")]
        private static extern 
            uint GetPrivateProfileInt(
                                        string lpAppName,
                                        string lpKeyName,
                                        int nDefault,
                                        string lpFileName
                                        );

        [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileStringA")]
        public static extern 
            uint GetPrivateProfileStringByByteArray(
                                                    string lpAppName,
                                                    string lpKeyName,
                                                    string lpDefault,
                                                    byte[] lpReturnedString,
                                                    uint nSize,
                                                    string lpFileName
                                                    );

        [DllImport("KERNEL32.DLL")]
        private static extern 
            uint WritePrivateProfileString(
                                        string lpAppName,
                                        string lpKeyName,
                                        string lpString,
                                        string lpFileName
                                        );

        //*******************************************
        // GetIniString
        //
        //*******************************************

        /// <summary>
        /// INIファイルから値を取得する
        /// </summary>
        /// <param name="lpSection">セッション名称</param>
        /// <param name="lpKeyName">キー名称</param>
        /// <param name="lpFileName">INIファイル名</param>
        /// <returns></returns>
        public static string GetIniString(string lpSection, string lpKeyName, string lpFileName)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder(1024);

            uint sLen = GetPrivateProfileString(lpSection, lpKeyName, "", sb, (uint)sb.Capacity, lpFileName);

            return sb.ToString();
        }

        //*******************************************
        // GetPrivateProfileInt
        //
        //*******************************************

        /// <summary>
        /// 
        /// </summary>
        /// <param name="lpSection"></param>
        /// <param name="lpKeyName"></param>
        /// <param name="lpFileName"></param>
        /// <returns></returns>
        public static uint GetIniValue(string lpSection, string lpKeyName, string lpFileName)
        {
            // 整数値を読み出す
            uint resultValue= GetPrivateProfileInt(lpSection, lpKeyName, 0, lpFileName);

            return resultValue;
        }


        //*******************************************
        // WritePrivateProfileString
        //
        //*******************************************

        /// <summary>
        /// INIファイルに値を書き込む
        /// </summary>
        /// <param name="lpSection">セッション名称</param>
        /// <param name="lpKeyName">キー名称</param>
        /// <param name="lpValue">セットする値</param>
        /// <param name="lpFileName">INIファイル名</param>
        /// <returns></returns>
        public static bool SetIniString(string lpSection, string lpKeyName, string lpValue, string lpFileName)
        {
            long result = WritePrivateProfileString(lpSection, lpKeyName, lpValue, lpFileName);
            return result != 0;
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="lpSection"></param>
        /// <param name="lpKeyName"></param>
        /// <param name="lpFileName"></param>
        public static void DelKeyAndData_pair(string lpSection, string lpKeyName, string lpFileName)
        {
            // 1つのキーと値のペアを削除する
            WritePrivateProfileString(lpSection, lpKeyName, null, lpFileName);
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="lpSection"></param>
        /// <param name="lpFileName"></param>
        public static void DelKeyAndData_all(string lpSection, string lpFileName)
        {
            // 指定セクション内の全てのキーと値のペアを削除する
            WritePrivateProfileString(lpSection, null, null, lpFileName);
        }

        //*******************************************
        // GetPrivateProfileStringByByteArray
        //
        //*******************************************

        /// <summary>
        /// キーリスト
        /// </summary>
        /// <param name="lpSection"></param>
        /// <param name="lpFileName"></param>
        /// <returns></returns>
        public static string[] GetKeys(string lpSection, string lpFileName)
        {

            byte[] ar1 = new byte[1024];
            uint resultSize1= GetPrivateProfileStringByByteArray(lpSection, null, "", ar1,(uint)ar1.Length, lpFileName);
            string result1 = Encoding.Default.GetString(ar1, 0, (int)resultSize1 - 1);
            string[] keys = result1.Split('\0');
            return keys;

        }

        /// <summary>
        /// セクションの一覧
        /// </summary>
        /// <param name="lpFileName"></param>
        /// <returns></returns>
        public static string[] GeSections(string lpFileName)
        {
            // 指定ファイルのセクションの一覧を得る
            byte[] ar2 = new byte[1024];
            uint resultSize2 = GetPrivateProfileStringByByteArray(null, null, "", ar2, (uint)ar2.Length, lpFileName);
            string result2 = System.Text.Encoding.Default.GetString(ar2, 0, (int)resultSize2 - 1);
            string[] sections = result2.Split('\0');
            return sections;
        }
    }
}

INIファイル処理

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

namespace INI.IniFiles
{
    class IniProc
    {
        public static void Proc()
        {
            string FilePath = @"C:\MyFile.ini";
            FilePath = @"MyFile.ini";

            //string s = IniFiles.GetIniString("Section1", "KEY1", FilePath);
            IniFiles.SetIniString("Section1", "KEY1", "AAAA", FilePath);
            IniFiles.SetIniString("Section1", "KEY2", "BBBB", FilePath);
            IniFiles.SetIniString("Section1", "KEY3", "1", FilePath);
            IniFiles.SetIniString("Section2", "KEY2", "AAAA", FilePath);
            IniFiles.SetIniString("Section3", "KEY3", "AAAA", FilePath);

            //-----------------------
            // 文字列を読み出す
            //-----------------------
            StringBuilder sb = new StringBuilder(1024);
            string sSection = "Section1";
            string sKey = "KEY1";

            string sRes = IniFiles.GetIniString(sSection, sKey, FilePath);

            Console.WriteLine("{0}に含まれる{1}の数値: {2}", sSection,sKey, sRes);

            //-----------------------
            // 数値を読み出す
            //-----------------------
            sSection = "Section1";
            sKey = "KEY3";

            uint uiRes = IniFiles.GetIniValue(sSection, sKey, FilePath);
            Console.WriteLine("{0}に含まれる{1}の値: {2}", sSection, sKey, uiRes);

            //-----------------------
            // Sectionリスト
            //-----------------------
            string[] sections = IniFiles.GeSections(FilePath);
            foreach (string section in sections)
            {
                Console.WriteLine("このファイルに含まれるセクション名: {0}", section);
            }
            Console.WriteLine("");

            //-----------------------
            // keyリスト
            //-----------------------
            sSection = "Section1";
            string[] keys = IniFiles.GetKeys(sSection, FilePath);
            foreach (string key in keys)
            {
                Console.WriteLine(
                  "{0}セクションに含まれるキー名: {1}", sSection,key);
            }
            Console.WriteLine("");

        }
    }
}