【C#】様々なデータ型に対応したiniファイル読み書きクラスのサンプル

C#

ご使用の際は、必ずご自身で動作確認を行ってください。

できること

以下の型についてiniファイルへの読み書きができます。

  • プリミティブ型
  • 文字列
  • decimal
  • DateTime

サンプル

class IniFile
{
    // iniファイルのパス
    public string FilePath { get; private set; }

    // 処理対象のセクション
    public string Section { get; set; }

    // コンストラクタ
    public IniFile(string path)
    {
        FilePath = path;
        Section = null;
    }

    // 値のセット
    public void SetValue<T>(string key, T value)
    {
        if (Section == null)
        {
            throw new InvalidOperationException("セクションが指定されていません");
        }

        // サポートしている型なら処理
        if (IsSupportedType(typeof(T)))
        {
            string strValue = value.ToString();
            WritePrivateProfileString(Section, key, strValue, FilePath);
        }
        else
        {
            throw new InvalidOperationException($"未対応の型です:{typeof(T)}");
        }
    }

    // 値の取得
    public T GetValue<T>(string key, T defaultValue)
    {
        if (Section == null)
        {
            throw new InvalidOperationException("セクションが指定されていません");
        }

        // 文字列として取得
        var sb = new StringBuilder(1024);
        GetPrivateProfileString(Section, key, "", sb, sb.Capacity, FilePath);
        string value = sb.ToString().Trim();

        // 取得失敗時はデフォルト値
        if (string.IsNullOrEmpty(value))
        {
            return defaultValue;
        }

        // サポートしている型なら処理
        if (IsSupportedType(typeof(T)))
        {
            return (T)Convert.ChangeType(value, typeof(T));
        }
        else
        {
            throw new InvalidOperationException($"未対応の型です:{typeof(T)}");
        }
    }

    // サポートしている型か?
    bool IsSupportedType(Type targetType)
    {
        return targetType.IsPrimitive ||
               targetType == typeof(string) ||
               targetType == typeof(decimal) ||
               targetType == typeof(DateTime);
    }

    // API
    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
}

使用例

private void button1_Click(object sender, EventArgs e)
{
    // iniファイルのパスを作成(実行ファイルと同じ場所にsample.ini)
    string iniPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\sample.ini";

    // iniファイルのオブジェクト生成
    IniFile ini = new IniFile(iniPath);

    // iniファイルへの書き込み
    ini.Section = "Section1";
    ini.SetValue("Key1", -10000);
    ini.SetValue("Key2", "Hello, IniFile!");
    ini.SetValue("Key3", true);
    ini.SetValue("Key4", DateTime.Now);
    //ini.SetValue("Key5", new Point(0, 0));  // エラー発生:未対応の型です

    // iniファイルからの読み出し
    ini.Section = "Section1";
    int intValue = ini.GetValue("Key1", 0);                      // デフォルト値を0に指定
    string stringValue = ini.GetValue("Key2", "DefaultValue");   // デフォルト値を指定
    bool boolValue = ini.GetValue("Key3", false);                // デフォルト値にfalseを指定
    DateTime datetime = ini.GetValue("Key4", DateTime.MinValue); // デフォルト値に最小値を指定

    // 読みだした値を表示
    Console.WriteLine($"Key1: {intValue}");
    Console.WriteLine($"Key2: {stringValue}");
    Console.WriteLine($"Key3: {boolValue}");
    Console.WriteLine($"Key4: {datetime}");
}
タイトルとURLをコピーしました