戻る


iniファイルを扱うクラスを作成してみた。

http://www.atmarkit.co.jp/fdotnet/dotnettips/039inifile/inifile.html




using System;
using System.Text;
using System.Runtime.InteropServices;

namespace SystemPlan.System.WindowsAPI
{

    /// <summary>
    /// Windows固有の設定ファイルであるiniファイルを読み書きできる機能を提供する。
    /// 本クラスは、KERNEL32.DLL を呼び出しており、windows依存である事に注意。
    /// </summary>

    public class IniFileHandler
    {


        [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileString")]
        private static extern uint
            DllGetPrivateProfileString(
                string lpAppName,
                string lpKeyName, 
                string lpDefault,
                StringBuilder lpReturnedString, 
                uint nSize,
                string lpFileName);


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


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

        // GetLastError を用いたい場合は、SetLastError=true を宣言しておく必要あがるらしい
        [DllImport("KERNEL32.DLL",SetLastError=true, EntryPoint = "WritePrivateProfileString")]
        private static extern uint 
            DllWritePrivateProfileString(
                string lpAppName,
                string lpKeyName,
                string lpString,
                string lpFileName);



        ///<summary>
        ///iniファイルから文字列を読み出す。
        ///</summary>
        ///<param name="fileName">iniファイル名をフルパスで指定</param>
        ///<param name="key">キー</param>
        ///<param name="sectionName">セクション名</param>
        ///<returns>取得した文字列。取得に失敗した場合は、“”空文字が返却される
        ///</returns>
        public static String GetPrivateProfileString(string fileName,string sectionName, string key)
        {
            return IniFileHandler.GetPrivateProfileString(fileName, sectionName, key, "");
        }

        ///<summary>
        ///iniファイルから文字列を読み出す。
        ///</summary>
        ///<param name="fileName">iniファイル名をフルパスで指定</param>
        ///<param name="key">キー</param>
        ///<param name="sectionName">セクション名</param>
        ///<param name="defaultStrigng">iniファイルから取得できなかった場合に返却する文字列</param>
        ///<returns>取得した文字列。取得に失敗した場合は、defaultStrigngが返却される
        ///</returns>
        public static String GetPrivateProfileString(string fileName, string sectionName, string key, string defaultStrigng)
        {

            if (String.IsNullOrEmpty(fileName))
            {
                throw new ArgumentException("fileName is NullOrEmpty");
            }

            if (String.IsNullOrEmpty(sectionName))
            {
                throw new ArgumentException("sectionName is NullOrEmpty");
            }

            if (String.IsNullOrEmpty(key))
            {
                throw new ArgumentException("key is NullOrEmpty");
            }

            if (defaultStrigng == null)
            {
                throw new ArgumentException("defaultStrigng is NullOrEmpty");
            }

            StringBuilder sb = new StringBuilder(1024);
            IniFileHandler.DllGetPrivateProfileString(sectionName, key, defaultStrigng, sb, (uint)sb.Capacity, fileName);

            return sb.ToString();

        }


        ///<summary>
        ///iniファイルから整数値を読み出す。
        ///</summary>
        ///<param name="fileName">iniファイル名をフルパスで指定</param>
        ///<param name="sectionName">セクション名</param>
        ///<param name="key">キー</param>
        ///<returns>取得した整数値。取得に失敗した場合は、-1 が返却される
        ///</returns>
        public static int GetPrivateProfileInt(string fileName, string sectionName, string key)
        {
            return GetPrivateProfileInt(fileName, sectionName, key, -1);

        }


        ///<summary>
        ///iniファイルから整数値を読み出す。
        ///</summary>
        ///<param name="fileName">iniファイル名をフルパスで指定</param>
        ///<param name="sectionName">セクション名</param>
        ///<param name="key">キー</param>
        ///<param name="defalultValue">iniファイルから取得できなかった場合に返却する整数値</param>
        ///<returns>取得した整数値。取得に失敗した場合は、defaultStrigngが返却される
        ///</returns>
        public static int GetPrivateProfileInt(string fileName, string sectionName, string key, int defalultValue)
        {


            if (String.IsNullOrEmpty(fileName))
            {
                throw new ArgumentException("fileName is NullOrEmpty");
            }

            if (String.IsNullOrEmpty(sectionName))
            {
                throw new ArgumentException("sectionName is NullOrEmpty");
            }

            if (String.IsNullOrEmpty(key))
            {
                throw new ArgumentException("key is NullOrEmpty");
            }


            int resultValue;

            resultValue = (int)DllGetPrivateProfileInt(sectionName, key,defalultValue, fileName);
            return resultValue;

        }

        /// <summary>
        /// iniファイルに情報を書き込む。
        /// 既に存在している時は、値を更新する。
        /// 無いときは、作成される。
        /// </summary>
        /// <param name="fileName">iniファイル名をフルパスで指定</param>
        /// <param name="sectionName">セクション名</param>
        /// <param name="key">キー</param>
        /// <param name="stringValue">設定する値</param>
        public static void WritePrivateProfileString(string fileName, string sectionName, string key, string stringValue)
        {

            if (String.IsNullOrEmpty(fileName))
            {
                throw new ArgumentException("fileName is NullOrEmpty");
            }

            if (String.IsNullOrEmpty(sectionName))
            {
                throw new ArgumentException("sectionName is NullOrEmpty");
            }

            if (String.IsNullOrEmpty(key))
            {
                throw new ArgumentException("key is NullOrEmpty");
            }

            if (String.IsNullOrEmpty(stringValue))
            {
                throw new ArgumentException("stringValue is NullOrEmpty");
            }

            uint result;
            result = DllWritePrivateProfileString(sectionName, key, stringValue, fileName);

            if (result == 0)
            {

                //  http://blog.tbl.jp/2007/10/cwin32apigetlasterror.html

                // http://ir9.jp/prog/ayu/win32err.htm

                int resutltGetLastError = Marshal.GetLastWin32Error();

                string exceptionString= string.Format("WritePrivateProfileString Error. GetLastError()={0}", resutltGetLastError);

                throw new Exception(exceptionString);
            }


        }


        /// <summary>
        ///指定ファイルのセクションの一覧を得る 
        /// </summary>
        /// <param name="fileName">iniファイル名をフルパスで指定</param>
        /// <returns>セクション名の配列。取得に失敗した場合は、ゼロ個の配列を返却する</returns>
        public static string[] GetPrivateProfileSectionNames(string fileName)
        {


            if (String.IsNullOrEmpty(fileName))
            {
                throw new ArgumentException("fileName is NullOrEmpty");
            }



            /*
             * 正しいセクションキーには、空白のセクションキーは存在しない事を前提とした。
             * よって、空白のセクションキーだけの場合は、取得ができなかった事にして
             * ゼロ個の配列を返却する事にする
             */

            byte[] byteArray = new byte[1024];

            uint resultSize = DllGetPrivateProfileStringByByteArray(
                        null, 
                        null,
                        "*", //lpDefault 何か 1バイト分設定しておく必要あり。そうしないと、例外が発生してしまう
                        byteArray,
                        (uint)byteArray.Length, 
                        fileName);

            string resultString = Encoding.Default.GetString(byteArray, 0, (int)resultSize -1 );

            string[] sections = resultString.Split('\0');
            
            //空白だけのセクションの場合は、ゼロ個の配列を返却
            if ((sections.Length == 1) && (sections[0].Trim().Equals(""))){
                sections = new string[0];
            }

            return sections;

        }

        /// <summary>
        /// 指定セクションのキーの一覧を得る 
        /// </summary>
        /// <param name="fileName">iniファイル名をフルパスで指定</param>
        /// <param name="sectionName">セクション名</param>
        /// <returns>キー名の配列。取得に失敗した場合は、ゼロ個の配列を返却する</returns>
        public static string[] GetPrivateProfileKeys(string fileName, string sectionName)
        {


            if (String.IsNullOrEmpty(fileName))
            {
                throw new ArgumentException("fileName is NullOrEmpty");
            }

            if (String.IsNullOrEmpty(sectionName))
            {
                throw new ArgumentException("sectionName is NullOrEmpty");
            }


            byte[] byteArray = new byte[1024];

            uint resultSize = DllGetPrivateProfileStringByByteArray(
                        sectionName,
                        null,
                        "*", //lpDefault 何か 1バイト分設定しておく必要あり。そうしないと、例外が発生してしまう
                        byteArray,
                        (uint)byteArray.Length,
                        fileName);

            string resultString = Encoding.Default.GetString(byteArray, 0, (int)resultSize - 1);

            string[] sections = resultString.Split('\0');

            //空白だけのセクションの場合は、ゼロ個の配列を返却
            if ((sections.Length == 1) && (sections[0].Trim().Equals("")))
            {
                sections = new string[0];
            }

            return sections;
        }



    }
}


 

使用する側のサンプル




                //キーの値を読み込む(文字)
                string ss = IniFileHandler.GetPrivateProfileString(@"c:\sample.ini", "アプリ1", "キー1");


                ss = IniFileHandler.GetPrivateProfileString(" ", "アプリ1", "キー1");



                //キーの値を読み込む(整数値)
                int resultValue = IniFileHandler.GetPrivateProfileInt(@"c:\sample.ini", "アプリ1", "キー2", 9);

                //キーの値を読み込む(整数値)
                resultValue = IniFileHandler.GetPrivateProfileInt(@"c:\sample.ini", "アプリ1", "キー1");


                //セクションの一覧を取得する
                string[] resultString = IniFileHandler.GetPrivateProfileSectionNames(@"c:\sample.ini");

                Console.WriteLine("キーの数={0}", resultString.Length);

                foreach (string key in resultString)
                {
                    Console.WriteLine(
                      "アプリ1セクションに含まれるキー名: {0}", key);
                }


                //キーの一覧を取得する
                string[] resultString2;
                resultString2 = IniFileHandler.GetPrivateProfileKeys(@"c:\sample.ini", "アプリ1");

                //resultString2 = IniFileHandler.GetPrivateProfileKeys(null, "アプリ1");


                Console.WriteLine("キーの数={0}", resultString2.Length);

                foreach (string key in resultString2)
                {
                    Console.WriteLine(
                      "アプリ1セクションに含まれるキー名: {0}", key);
                }

                //データを書き込む
                IniFileHandler.WritePrivateProfileString(@"c:\sample.ini", "sec1", "app1", "データ");




戻る