C#でINIファイルの読み書きをするためにはWin32APIを使うか、ライブラリを使用するか、自分でINIファイルを解析するかしないといけません。
ここではWin32APIを使用してINIファイルを読み書きする方法を紹介します。
IniFileクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
public class IniFile { class NativeMethod { [DllImport("kernel32", EntryPoint = "GetPrivateProfileStringW", CharSet = CharSet.Unicode, SetLastError = true)] public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyname, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName); [DllImport("kernel32", EntryPoint = "WritePrivateProfileStringW", CharSet = CharSet.Unicode, SetLastError = true)] public static extern bool WritePrivateProfileString(string lpAppName, string lpKeyname, string lpString, string lpFileName); } public string this[string filaName, string section, string key, string defauleValue = ""] { get { return GetValue(filaName, section, key, defauleValue); } set { SetValue(filaName, section, key, value); } } public static string GetValue(string fileName, string section, string key, string defaultValue = null) { var sb = new StringBuilder(256); var result = NativeMethod.GetPrivateProfileString(section, key, defaultValue, sb, (uint)sb.Capacity, fileName); if(0 < result) { return sb.ToString(); } else { return defaultValue; } } public static T GetValue<T>(string fileName, string section, string key, T defaultValue = default) { var value = GetValue(fileName, section, key); try { return (T)Convert.ChangeType(value, typeof(T)); } catch { return defaultValue; } } public static bool SetValue(string fileName, string section, string key, string value) { return NativeMethod.WritePrivateProfileString(section, key, value, fileName); } public static bool SetValue<T>(string fileName, string section, string key, T value) { return NativeMethod.WritePrivateProfileString(section, key, value.ToString(), fileName); } } |
使用方法
インスタンスを生成せずに読み書きする。
1 2 3 4 5 6 7 8 |
const string INI_FILENAME = @"test.ini"; const string INI_SECTION = "test"; const string INI_KEY = "abc"; IniFileEx.SetValue(INI_FILENAME, INI_SECTION, INI_KEY, "あいうえお"); var value = IniFileEx.GetValue(INI_FILENAME, INI_SECTION, INI_KEY); // value:あいうえお |
インスタンスを生成して読み書きする。
1 2 3 4 5 6 7 8 9 |
const string INI_FILENAME = @"E:\Users\ゴリヘイ\デスクトップa\新しいテキスト ドキュメント.ini"; const string INI_SECTION = "test"; const string INI_KEY = "abc"; var ini = new IniFileEx(); ini[INI_FILENAME, INI_SECTION, INI_KEY] = "かきくけこ"; value = ini[INI_FILENAME, INI_SECTION, INI_KEY]; // value:かきくけこ |
インデクサーは静的クラスに定義できないため、静的クラスにしていません。
静的クラスにしない場合はコンストラクタでファイルパスを受け取って引数を減らしたりするといいですね。
コメント