[C#] INI 檔案操作功能模組實作

實作一個 INI 檔案操作的功能模組

實務上常常需要用到 INI 來記錄設定值,這裡記錄一下自己寫的功能類別方便之後查詢使用~

C# 中沒有提供相關的功能類別,需要借用一下系統 DLL 提供的 INI 操作功能,先用 DllImport 引入功能

[DllImport("kernel32", CharSet = CharSet.Auto)]
private static extern long WritePrivateProfileString(
    string section,
    string key,
    string val,
    string filePath);

[DllImport("kernel32", CharSet = CharSet.Auto)]
private static extern int GetPrivateProfileString(
    string section,
    string key,
    string def,
    StringBuilder retVal,
    int size,
    string filePath);

好了,有了 WritePrivateProfileString 跟 GetPrivateProfileString 這兩個方法了,能操作字串就好了,後面有資料類型要求再做轉型即可

接下來就是完善一下這個功能類別,這裡取名 IniHelper,以下就放上完整內容,其他參照註解說明啦~XD

public class IniHelper
{
    [DllImport("kernel32", CharSet = CharSet.Auto)]
    private static extern long WritePrivateProfileString(
        string section,
        string key,
        string val,
        string filePath);

    [DllImport("kernel32", CharSet = CharSet.Auto)]
    private static extern int GetPrivateProfileString(
        string section,
        string key,
        string def,
        StringBuilder retVal,
        int size,
        string filePath);

    private string _FileName;
    public string FileName
    {
        get { return _FileName; }
        set
        {
            if (Path.GetDirectoryName(value) == "")
            {
                value = $@"{Directory.GetCurrentDirectory()}\{value}";
            }
            _FileName = value;
        }
    }

    // ------------------------------------------------------------------------ //
    public IniHelper(string fileName)
    {
        // 指定設定檔
        FileName = fileName;
    }

    // ------------------------------------ //
    /// <summary>
    /// 基本INI寫入功能;需使用實例化物件來指定檔案
    /// </summary>
    /// <param name="Section">節名</param>
    /// <param name="Key">鍵名</param>
    /// <param name="Value">鍵值</param>
    public void Write(string Section, string Key, string Value)
    {
        WritePrivateProfileString(Section, Key, Value, this.FileName);
    }

    /// <summary>
    /// 基本INI讀取功能;需使用實例化物件來指定檔案
    /// </summary>
    /// <param name="Section">節名</param>
    /// <param name="Key">鍵名</param>
    /// <param name="DefaultValue">預設鍵值</param>
    /// <returns></returns>
    public string Read(string Section, string Key, string DefaultValue = "")
    {
        StringBuilder temp = new StringBuilder(512);
        int i = GetPrivateProfileString(Section, Key, DefaultValue, temp, 512, this.FileName);
        return temp.ToString();
    }

    /// <summary>
    /// 進階INI寫入功能;可靜態引用,需在參數指定檔案
    /// </summary>
    /// <param name="Section">節名</param>
    /// <param name="Key">鍵名</param>
    /// <param name="Value">鍵值</param>
    /// <param name="IniFileFullPath">INI檔案</param>
    public static void SetProfileString(string Section, string Key, string Value, string IniFileFullPath = "")
    {
        if (Path.GetDirectoryName(IniFileFullPath) == "")
        {
            IniFileFullPath = $@"{Directory.GetCurrentDirectory()}\{IniFileFullPath}";
        }

        WritePrivateProfileString(Section, Key, Value, IniFileFullPath);
    }

    /// <summary>
    /// 進階INI讀取功能;可靜態引用,需在參數指定檔案
    /// </summary>
    /// <param name="Section">節名</param>
    /// <param name="Key">鍵名</param>
    /// <param name="DefaultValue">預設鍵值</param>
    /// <param name="IniFileFullPath">INI檔案</param>
    /// <returns></returns>
    public static string GetProfileString(string Section, string Key, string DefaultValue = "", string IniFileFullPath = "")
    {
        if (Path.GetDirectoryName(IniFileFullPath) == "")
        {
            IniFileFullPath = $@"{Directory.GetCurrentDirectory()}\{IniFileFullPath}";
        }

        StringBuilder temp = new StringBuilder(512);
        int i = GetPrivateProfileString(Section, Key, DefaultValue, temp, temp.Capacity, IniFileFullPath);
        return temp.ToString();
    }
}

使用上分兩種情況,一是實體化(New)這個類別(給定 INI 檔案路徑)然後就可以使用 Write / Read 這兩個方法

另一個就是直接使用該類別靜態方法 SetProfileString/GetProfileString ,使用上多了一個設定 INI 檔案路徑的參數

當初為了方便以上兩種情況都可以用,就一起做起來啦 XD

使用上就看自己哪個方便就用哪個,我自己應該比較常用靜態方法那組,只是打得字比較多了,改天再來重新定義一下了~就醬~