public class IniFileHelper
{
private readonly string _filePath;
/// <summary>
/// 向INI文件写入一个键值对
/// </summary>
/// <param name="section">节名称,如果section和key都为null:删除整个文件内容</param>
/// <param name="key">键名称,如果为null:删除指定的节</param>
/// <param name="value">要写入的值,如果为null:删除指定的键</param>
/// <param name="filePath">INI完整路径</param>
/// <returns></returns>
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern long WritePrivateProfileString(string section, string key, string value, string filePath);
/// <summary>
/// 从INI文件读取一个键值
/// </summary>
/// <param name="section">节名称</param>
/// <param name="key">键名称</param>
/// <param name="defaultValue">如果键不存在返回的默认值</param>
/// <param name="returnValue">用于接收返回值的StringBuider</param>
/// <param name="size">StringBuilder的容量</param>
/// <param name="filePath">INI文件完整路径</param>
/// <returns>实际读到的字符数</returns>
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern int GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder returnValue, int size, string filePath);
/// <summary>
/// 读取整个节的所有键值对
/// </summary>
/// <param name="section">节名称</param>
/// <param name="returnValue">指向接收数据的非托管内存指针</param>
/// <param name="size">缓冲区大小</param>
/// <param name="filePath">INI文件完整路径</param>
/// <returns>实际读取到的字符数</returns>
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern int GetPrivateProfileSection(string section, IntPtr returnValue, int size, string filePath);
/// <summary>
/// 构造函数
/// </summary>
/// <param name="filePath"></param>
public IniFileHelper(string filePath)
{
_filePath = filePath;
EnsureIniFileExists();
}
/// <summary>
/// 确保INI文件存在,如果不存在则创建
/// </summary>
public void EnsureIniFileExists()
{
try
{
string directory = Path.GetDirectoryName(_filePath);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
if (!File.Exists(_filePath))
{
File.WriteAllText(_filePath, "INI 配置文件\r\n 创建时间:" + DateTime.Now.ToString("G") + "\r\n", Encoding.UTF8);
}
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 检查INI文件是否存在
/// </summary>
/// <returns></returns>
public bool Exists()
{
return File.Exists(_filePath);
}
/// <summary>
/// 检查节是否存在
/// </summary>
/// <param name="section"></param>
/// <returns></returns>
public bool SectionExists(string section)
{
try
{
if (!Exists())
{
return false;
}
IntPtr pReturnedString = Marshal.AllocCoTaskMem(2048);
int size = GetPrivateProfileSection(section, pReturnedString, 2048, _filePath);
Marshal.FreeCoTaskMem(pReturnedString);
return size > 0;
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 检查键是否存在
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <returns></returns>
public bool KeyExists(string section, string key)
{
try
{
if (!Exists())
{
return false;
}
StringBuilder returnValue = new StringBuilder(255);
int readChars = GetPrivateProfileString(section, key, "", returnValue, returnValue.Capacity, _filePath);
return readChars > 0;
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 写入值
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="value"></param>
public void WriteValue(string section, string key, string value)
{
try
{
EnsureIniFileExists();
WritePrivateProfileString(section, key, value, _filePath);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 读取值
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public string ReadValue(string section, string key, string defaultValue = "")
{
try
{
if (!Exists())
{
return defaultValue;
}
StringBuilder returnValue = new StringBuilder(255);
int readChars = GetPrivateProfileString(section, key, defaultValue, returnValue, returnValue.Capacity, _filePath);
return readChars > 0 ? returnValue.ToString() : defaultValue;
}
catch (Exception)
{
return defaultValue;
throw;
}
}
/// <summary>
/// 读取整数值
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public int ReadIntValue(string section, string key, int defaultValue = 0)
{
string stringValue = ReadValue(section, key, defaultValue.ToString());
if (int.TryParse(stringValue, out int intValue))
{
return intValue;
}
return defaultValue;
}
/// <summary>
/// 读取布尔值
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public bool ReadBoolValue(string section, string key, bool defaultValue = false)
{
string stringValue = ReadValue(section, key, defaultValue.ToString());
if (bool.TryParse(stringValue, out bool boolValue))
{
return boolValue;
}
if (stringValue == "1" || stringValue.Equals("yes", StringComparison.OrdinalIgnoreCase))
{
return true;
}
if (stringValue == "0" || stringValue.Equals("no", StringComparison.OrdinalIgnoreCase))
{
return false;
}
return defaultValue;
}
/// <summary>
/// 删除键
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
public void DeleteKey(string section, string key)
{
try
{
WriteValue(section, key, null);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 删除节
/// </summary>
/// <param name="section"></param>
public void DeleteSection(string section)
{
try
{
WriteValue(section, null, null);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 删除INI文件
/// </summary>
public void DeleteFile()
{
try
{
if (Exists())
{
File.Delete(_filePath);
}
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 提供INI文件的完整路径,只读
/// </summary>
public string FilePath => _filePath;}