本記事では、様々なデータ型に対応したiniファイル読み書きクラスのサンプルコードを紹介します。ご使用の際は、必ずご自身で動作確認を行ってください。
できること
以下の型について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}");
}
まとめ
本記事では、様々なデータ型に対応したiniファイル読み書きクラスのサンプルコードを紹介しました。