INIファイルを編集する

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

C#では標準でINIファイルを操作することが非常に面倒になっています。
というわけでINIファイルを簡単に編集できるライブラリを作ってみた。

説明

INIファイルを操作するのに必要なWinAPIは以下の3つ

ソースコード

public class IniFile
{
    internal partial class NativeMethod
    {
        [DllImport("KERNEL32.DLL")]
        public static extern uint WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);
        [DllImport("KERNEL32.DLL")]
        public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);
        [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileStringA")]
        public static extern uint GetPrivateProfileStringByByteArray(string lpAppName, string lpKeyName, string lpDefault, byte[] lpReturnedString, uint nSize, string lpFileName);
    }
    public IniFile(string filePath)
    {
        this.FilePath = filePath;
        if (!File.Exists(FilePath))
            File.Create(filePath).Close();
    }
    public string FilePath { get; set; }
    public string this[string section, string key]
    {
        get
        {
            return this[section, key, null];
        }
        set
        {
            NativeMethod.WritePrivateProfileString(section, key, value, this.FilePath);
        }
    }
    public string this[string section, string key, string def]
    {
        get
        {
            StringBuilder sb = new StringBuilder(1024);
            NativeMethod.GetPrivateProfileString(section, key, def, sb, (uint)sb.Capacity, this.FilePath);
            return sb.ToString();
        }
    }
    public string[] GetSections()
    {
        byte[] ar2 = new byte[1024];
        uint resultSize2 = NativeMethod.GetPrivateProfileStringByByteArray(null, null, "", ar2, (uint)ar2.Length, this.FilePath);
        string result2 = Encoding.Default.GetString(ar2, 0, (int)resultSize2);
        string[] sections = result2.Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
        return sections;
    }
    public string[] GetKeys(string section)
    {
        byte[] ar1 = new byte[1024];
        uint resultSize1 = NativeMethod.GetPrivateProfileStringByByteArray(section, null, "", ar1, (uint)ar1.Length, this.FilePath);
        string result1 = Encoding.Default.GetString(ar1, 0, (int)resultSize1);
        string[] keys = result1.Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
        return keys;
    }
    public void DeleteSection(string section)
    {
        this[section, null] = null;
    }
    public void DeleteKey(string section, string key)
    {
        this[section, key] = null;
    }
}

使い方

結構シンプルに扱うことができ、初期化の際にファイルパスを指定してあげるだけです。
存在しないファイルパスを指定した場合、新しいファイルが作成されます。

// iniファイルを開く。存在しない場合は新規作成
IniFile ini = new IniFile(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\test.ini");
// 書き込みをする
ini["section", "key"] = "test";
// キーを削除する
ini["section", "key"] = null;
ini.DeleteKey("section", "key");
// セクションを削除する
ini["section", null] = null;
ini.DeleteSection("section");
// セクション一覧を取得する
string[] sections = ini.GetSections();
// キー一覧を取得する
string[] keys = ini.GetKeys("section");

WinAPIを使用してINIファイルを操作しているため、ファイルを読み書きするたびにファイルを開いています。そのため、ファイルを閉じる作業は必要ありません。
ファイルを自動作成してほしくない場合は、IniFileクラスの初期化部分を編集してください。

ダウンロード

[wpdm_file id=3]