.NET Framework 雖提供 ConfigurationManager 操作 .config,但輕量級、跨程式共用、無 XML 開銷的 INI 檔在舊系統整合、簡易設定儲存仍常見。本文示範 P/Invoke 呼叫 kernel32.dll 的 WritePrivateProfileString 與 GetPrivateProfileString 完成讀寫。
using System.Runtime.InteropServices;
using System.Text;
public class IniFile
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
private readonly string _path;
public IniFile(string path) { _path = Path.GetFullPath(path); }
public void Write(string section, string key, string value)
{
WritePrivateProfileString(section, key, value, _path);
}
public string Read(string section, string key, string defaultValue = "")
{
var sb = new StringBuilder(255);
GetPrivateProfileString(section, key, defaultValue, sb, sb.Capacity, _path);
return sb.ToString();
}
}
var ini = new IniFile(@"C:\Config\AppSettings.ini");
// 寫入
ini.Write("Database", "Server", "192.168.1.100");
ini.Write("Database", "Port", "1433");
ini.Write("UI", "Theme", "Dark");
// 讀取
string server = ini.Read("Database", "Server", "localhost");
int port = int.Parse(ini.Read("Database", "Port", "1433"));
string theme = ini.Read("UI", "Theme", "Light");
| 函式 | 參數 | 說明 |
|---|---|---|
WritePrivateProfileString | section | 區段名稱(如 [Database]) |
| key | 鍵名 | |
| val | 值,若為 null 則刪除該鍵 | |
| filePath | INI 完整路徑,若不存在會自動建立 | |
| return | 非零表示成功 | |
GetPrivateProfileString | section | 區段名稱 |
| key | 鍵名 | |
| def | 找不到時的預設值 | |
| retVal | StringBuilder 接收緩衝區 | |
| size | 緩衝區大小(建議 255 或更大) | |
| filePath | INI 完整路徑 |
ReadInt、ReadBool、ReadEnum<T> 強型別方法。IDisposable 無資源釋放需求,但可提供 Flush() 強制寫入(API 已同步寫入磁碟)。lock),API 本身非執行緒安全。GetPrivateProfileSectionNames、GetPrivateProfileSection。INI 檔雖老舊,但在「單一檔案、簡單鍵值、跨語言/進程共用」場景下依然實用,封裝好一個 IniFile 類別即可長期復用。