[SectionName]
KeyName=Value
AnotherKey=AnotherValue
///
/// 讀取 INI 檔案指定區段的鍵值
///
/// 區段名稱 (不含方括號)
/// 鍵名稱
/// 找不到時回傳的預設值
/// INI 檔完整路徑
/// 鍵值字串
private string GetPrivateProfileString(string section, string key, string defaultValue, string filePath)
{
// 1. 讀取整個檔案內容
string allText;
try
{
using (StreamReader sr = new StreamReader(filePath, Encoding.Default))
{
allText = sr.ReadToEnd();
}
}
catch
{
return defaultValue; // 檔案不存在或讀取失敗
}
// 2. 依換行符分割 (支援 \r\n, \n, \r)
string[] lines = allText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
bool inTargetSection = false;
foreach (string rawLine in lines)
{
string line = rawLine.Trim();
// 略過空行與註解
if (line.Length == 0 || line.StartsWith(";") || line.StartsWith("#"))
continue;
// 偵測區段標題 [Section]
if (line.StartsWith("[") && line.EndsWith("]"))
{
string currentSection = line.Substring(1, line.Length - 2).Trim();
inTargetSection = string.Equals(currentSection, section, StringComparison.OrdinalIgnoreCase);
continue;
}
// 若不在目標區段,跳過
if (!inTargetSection) continue;
// 解析 Key=Value
int eqIdx = line.IndexOf('=');
if (eqIdx > 0)
{
string k = line.Substring(0, eqIdx).Trim();
string v = line.Substring(eqIdx + 1).Trim();
if (string.Equals(k, key, StringComparison.OrdinalIgnoreCase))
return v;
}
}
return defaultValue;
}
string dbServer = GetPrivateProfileString("Database", "Server", "localhost", @"C:\Config\App.ini");
string dbPort = GetPrivateProfileString("Database", "Port", "1433", @"C:\Config\App.ini");
Dictionary> (區段 → 鍵值表),避免重複讀檔。WritePrivateProfileString (可呼叫 Windows API kernel32.dll 或自行重寫檔案)。Encoding.Default (ANSI) 或 Encoding.UTF8。null 或拋出自訂例外。.NET 專案建議優先使用 appsettings.json + IConfiguration 或 XML 組態檔,結構更清晰、型別安全、支援依賴注入。