首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 讀寫 INI 設定檔:使用 Windows API WritePrivateProfileString/GetPrivateProfileString

     編輯:關於C#

.NET Framework 雖提供 ConfigurationManager 操作 .config,但輕量級、跨程式共用、無 XML 開銷的 INI 檔在舊系統整合、簡易設定儲存仍常見。本文示範 P/Invoke 呼叫 kernel32.dll 的 WritePrivateProfileString 與 GetPrivateProfileString 完成讀寫。

P/Invoke 宣告


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");

關鍵參數說明

函式參數說明
WritePrivateProfileStringsection區段名稱(如 [Database])
key鍵名
val值,若為 null 則刪除該鍵
filePathINI 完整路徑,若不存在會自動建立
return非零表示成功
GetPrivateProfileStringsection區段名稱
key鍵名
def找不到時的預設值
retValStringBuilder 接收緩衝區
size緩衝區大小(建議 255 或更大)
filePathINI 完整路徑

進階封裝建議

  • 新增 ReadInt、ReadBool、ReadEnum<T> 強型別方法。
  • 實作 IDisposable 無資源釋放需求,但可提供 Flush() 強制寫入(API 已同步寫入磁碟)。
  • 多執行緒同時寫入同一 INI 需自行加鎖(lock),API 本身非執行緒安全。
  • 支援區段/鍵列舉:GetPrivateProfileSectionNames、GetPrivateProfileSection。

替代方案

  • JSON/XML + Newtonsoft.Json/System.Text.Json:結構化、巢狀、強型別、人類可讀。
  • SQLite:查詢、交易、並發、ACID。
  • System.Configuration:.NET 應用程式標準設定機制。

INI 檔雖老舊,但在「單一檔案、簡單鍵值、跨語言/進程共用」場景下依然實用,封裝好一個 IniFile 類別即可長期復用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved