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,可以為你實現你想作的事情。
然後一切又變得簡單了。