1. 程式人生 > >C#中讀寫INI檔案的方法例子

C#中讀寫INI檔案的方法例子

[DllImport(“kernel32”)]

private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

[DllImport(“kernel32”)]

private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);

通過api函式GetPrivateProfileString讀取ini檔案,取不到值,測試了好長時間,都不行
確認程式,ini檔案都沒有錯誤的情況,最後發現是ini檔案編碼的原因。

將ini檔案的編碼格式,由utf8,改為unicode後,讀取正常了。

通常C#使用基於XML的配置檔案,不過如果有需要的話,比如要兼顧較老的系統,可能還是要用到INI檔案。
但C#本身並不具備讀寫INI檔案的API,只有通過呼叫非託管程式碼的方式,即系統自身的API才能達到所需的目的。

對應讀寫的方法分別為GetPrivateProfileString和WritePrivateProfileString。

GetPrivateProfileString中的各引數:
lpAppName —— section的名稱
lpKeyName —— key的名稱
lpDefault —— 如果lpKeyName沒有被找到的話,則將這個值複製到lpReturnedString中
lpReturnedString —— 用於返回結果的值
nSize —— lpReturnedString的字元長度
lpFileName —— INI檔名

WritePrivateProfileString中的各引數:
lpAppName —— section的名稱
lpKeyName —— key的名稱
lpString —— 與lpKeyName對應的值
lpFileName —— INI檔名

實際程式碼如下所示:

using System;
using System.Runtime.InteropServices;
using System.Text;
namespace INIDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            WritePrivateProfileString("Demo", "abc", "123", "c:\\demo.ini");

            StringBuilder temp = new StringBuilder();
            GetPrivateProfileString("Demo", "abc", "", temp, 255, "c:\\demo.ini");
            Console.WriteLine(temp);

            Console.ReadLine();
        }

        [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
        private static extern bool WritePrivateProfileString(
            string lpAppName, string lpKeyName, string lpString, string lpFileName);

        [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
        private static extern int GetPrivateProfileString(
            string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString,
            int nSize, string lpFileName);
    }
}

程式執行後INI檔案中的內容為:
複製程式碼 程式碼如下:

[Demo]
abc=123

這是一種相對簡單的方法,若是不想使用非託管方法,你也可以通過另一種比較麻煩的途徑解決這個問題。
由於INI檔案的格式是固定的,所以只要編寫相應的解析程式就可以完成同樣的讀寫功能,就是通常的字串處理而已。

如果你不願親自動手的話,不要緊,已經有現成的程式——Cinchoo framework,可以為你實現你想作的事情。

然後一切又變得簡單了。