ini 文件是一种经典的配置文件格式,在 Windows 系统中有着广泛的应用。特别在系统开发时,常用使用ini文件来配置系统参数;[Setting]
ServerIp=127.0.0.1
Port=3306
[Node2]
Item1=value
Item2=value
string ConfigPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SysConfig.ini");
IniFileHelper IntObj = new IniFileHelper(ConfigPath);
string ServerIp = IntObj.ReadString("Setting", "ServerIp");
IntObj.WriteString("Setting", "ServerIp", "192.168.0.12");
IntObj.DeleteKey("Setting", "Port");
public class CIniFileHelper
{
#region Windows ini文件API函数加载
[DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileString", CharSet = CharSet.Ansi)]
private static extern long WritePrivateProfileString(string section, byte[] key, byte[] val, string filePath);
[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString", CharSet = CharSet.Ansi)]
private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileInt(string lpApplicationName, string lpKeyName, int nDefault, string lpFileName);
[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileSectionNames", CharSet = CharSet.Ansi)]
private static extern int GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer, int nSize, string filePath);
[DllImport("KERNEL32.DLL ", EntryPoint = "GetPrivateProfileSection", CharSet = CharSet.Ansi)]
private static extern int GetPrivateProfileSection(string lpAppName, byte[] lpReturnedString, int nSize, string filePath);
#endregion
private static CIniFileHelper handle = null;
public static CIniFileHelper Handle
{
get
{
if (handle == null)
{
handle = new CIniFileHelper(m_szIniFilePath);
}
return handle;
}
}
public static string m_szIniFilePath;
public CIniFileHelper(string _szIniFilePath)
{
m_szIniFilePath = _szIniFilePath;
}
#region 读Ini键名值
public string ReadString(string sectionName, string keyName, string defaultValue = "")
{
try
{
const int MaxSize = 1024 * 1024 * 10;
byte[] Buffer = new byte[MaxSize];
StringBuilder temp = new StringBuilder(MaxSize);
int bufLen = GetPrivateProfileString(sectionName, keyName, defaultValue, Buffer, MaxSize, m_szIniFilePath);
return Encoding.UTF8.GetString(Buffer, 0, bufLen);
}
catch (Exception)
{
return "";
}
}
public int ReadInteger(string sectionName, string keyName, int value)
{
return GetPrivateProfileInt(sectionName, keyName, value, m_szIniFilePath);
}
public bool ReadBoolean(string sectionName, string keyName, bool defaultValue = false)
{
int temp = defaultValue ? 1 : 0;
int result = GetPrivateProfileInt(sectionName, keyName, temp, m_szIniFilePath);
return (result == 0 ? false : true);
}
#endregion
#region 获取节点、键名、值列表
#region 获取节点名称列表
public List<string> GetAllSectionNames()
{
List<string> sectionList = new List<string>();
try
{
int MAX_BUFFER = 32767;
IntPtr pReturnedString = Marshal.AllocCoTaskMem(MAX_BUFFER);
int bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, m_szIniFilePath);
if (bytesReturned != 0)
{
string local = Marshal.PtrToStringAnsi(pReturnedString, (int)bytesReturned).ToString();
Marshal.FreeCoTaskMem(pReturnedString);
sectionList.AddRange(local.Substring(0, local.Length - 1).Split('\0'));
}
}
catch (Exception)
{
sectionList = new List<string>();
}
return sectionList;
}
#endregion
#region 获取某个节点下所有键名、值
public int GetAllKeyValues(string section, out List<string> KeysList, out List<string> KeysValueList)
{
KeysList = new List<string>();
KeysValueList = new List<string>();
byte[] b = new byte[65535];
GetPrivateProfileSection(section, b, b.Length, m_szIniFilePath);
string s = System.Text.Encoding.UTF8.GetString(b);
string[] tmp = s.Split((char)0);
List<string> result = new List<string>();
foreach (string r in tmp)
{
if (r != string.Empty)
result.Add(r);
}
string[] keys = new string[result.Count];
string[] values = new string[result.Count];
for (int i = 0; i < result.Count; i++)
{
string[] item = result[i].Split(new char[] { '=' });
if (item.Length > 2)
{
keys[i] = item[0].Trim();
values[i] = result[i].Substring(keys[i].Length + 1);
}
if (item.Length == 2)
{
keys[i] = item[0].Trim();
values[i] = item[1].Trim();
}
else if (item.Length == 1)
{
keys[i] = item[0].Trim();
values[i] = "";
}
else if (item.Length == 0)
{
keys[i] = "";
values[i] = "";
}
}
KeysList = keys.ToList<string>();
KeysValueList = values.ToList<string>();
return result.Count;
}
#endregion
#region 获取节点键值列表
public List<IniSectionModel> GetAllKeyValueList(string section)
{
List<IniSectionModel> RetList = new List<IniSectionModel>();
try
{
List<string> KeysList = new List<string>();
List<string> KeysValueList = new List<string>();
int RetNum = GetAllKeyValues(section, out KeysList, out KeysValueList);
if (KeysList.Count > 0 && KeysValueList.Count > 0 && KeysList.Count == KeysValueList.Count)
{
for (int i = 0; i < KeysList.Count; i++)
{
IniSectionModel Node = new IniSectionModel();
Node.Sections = section;
Node.KeyName = KeysList[i];
Node.Value = KeysValueList[i];
RetList.Add(Node);
}
}
}
catch (Exception)
{
RetList = new List<IniSectionModel>();
}
return RetList;
}
#endregion
#endregion
#region 删除操作
public void ClearAll()
{
List<string> Sections = GetAllSectionNames();
foreach (var sec in Sections)
{
EraseSection(sec);
}
}
public void ClearSection(List<string> ClearSec)
{
foreach (var sec in ClearSec)
{
EraseSection(sec);
}
}
public void ClearFileNotInclude(string szNotClearSec)
{
List<string> Sections = GetAllSectionNames();
Sections.Remove(szNotClearSec);
foreach (var sec in Sections)
{
EraseSection(sec);
}
}
public bool EraseSection(string sectionName)
{
bool RetState = false;
try
{
WritePrivateProfileString(sectionName, null, null, m_szIniFilePath);
RetState = true;
}
catch (Exception)
{
RetState = false;
}
return RetState;
}
public bool DeleteKey(string sectionName, string keyName)
{
bool RetState = false;
try
{
WritePrivateProfileString(sectionName, Encoding.UTF8.GetBytes(keyName), null, m_szIniFilePath);
RetState = true;
}
catch (Exception)
{
RetState = false;
}
return RetState;
}
#endregion
#region 写入(更新&添加)Ini键名值
public void WriteString(string sectionName, string keyName, string value)
{
WritePrivateProfileString(sectionName, Encoding.UTF8.GetBytes(keyName), Encoding.UTF8.GetBytes(value), m_szIniFilePath);
}
public void WriteInteger(string sectionName, string keyName, int value)
{
WritePrivateProfileString(sectionName, Encoding.UTF8.GetBytes(keyName), Encoding.UTF8.GetBytes(value.ToString()), m_szIniFilePath);
}
public void WriteBoolean(string sectionName, string keyName, bool value)
{
string temp = value ? "1 " : "0 ";
WritePrivateProfileString(sectionName, Encoding.UTF8.GetBytes(keyName), Encoding.UTF8.GetBytes(temp), m_szIniFilePath);
}
#endregion
#region 动态添加节点、键名、值
public bool AddNewSectionWithKeyValues(string section, List<string> keyList, List<string> valueList)
{
bool bRst = true;
if (GetAllSectionNames().Contains(section))
{
return false;
}
List<string> listA = keyList.Distinct().ToList();
if (listA.Count != keyList.Count)
{
return false;
}
for (int i = 0; i < keyList.Count; i++)
{
WriteString(section, keyList[i], valueList[i]);
}
return bRst;
}
public bool AddSectionWithKeyValues(string section, string keyName, string keyValue)
{
bool bRst = true;
List<string> KeysList = new List<string>();
List<string> KeysValueList = new List<string>();
int RetNum = GetAllKeyValues(section, out KeysList, out KeysValueList);
if (KeysList.Contains(keyName))
{
return false;
}
WriteString(section, keyName, keyValue);
return bRst;
}
#endregion
}
public class IniSectionModel
{
public string Sections { get; set; }
public string KeyName { get; set; }
public string Value { get; set; }
}
阅读原文:原文链接
该文章在 2025/7/15 10:44:24 编辑过