C#读写INI配置文件:基于WinAPI的完整类封装与示例
在Windows系统开发中,虽然微软推荐使用注册表或XML格式进行配置存储,但简洁易读的INI配置文件依然被广泛应用于许多场景。由于C#自身没有内置直接操作INI文件的类,通常需要借助Windows API来实现。本文将详细介绍如何利用C#的 DllImport 特性,封装一个通用的 IniFile 类,并提供完整的读写配置示例。
为什么选择INI配置文件?
尽管现代应用开发中更倾向于使用JSON、XML或注册表等格式,但INI(Initialization File)文件因其纯文本结构、跨语言兼容性极强以及人类可读性高,在某些轻量级配置或老旧系统的兼容需求中仍具有独特优势。INI文件主要由若干节(Section)、键(Key)和值(Value)组成,结构清晰直观:
[Section] Key1=Value1 Key2=Value2
准备工作:核心原理
C#本身未提供直接的INI操作支持,但我们可以通过平台调用服务(P/Invoke)调用Windows内核级函数 kernel32.dll 中的两个核心API:
WritePrivateProfileString:用于向指定节、键写入对应值。GetPrivateProfileString:用于从指定节、键获取对应的值。
第一步:封装 IniFile 辅助类
为了实现便捷调用,我们可以创建一个独立的 IniFile 类来封装这些API调用。该类支持默认路径初始化,并提供多种重载方法以适配不同的读写需求。
第1步:定义类结构与API声明
首先引入必要的命名空间,并使用 [DllImport] 属性声明外部函数入口。注意读取字符串时需使用 StringBuilder 作为缓冲区。
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
class IniFile
{
/*
* 定义公共变量保存文件路径
*/
public string iniPath;
/*
* 声明WinAPI函数 (Kernel32)
*/
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
/// <summary>
/// 构造函数:设定ini文件路径,默认为当前路径下的 default.ini
/// </summary>
public IniFile(string iniPath = "./default.ini")
{
this.iniPath = iniPath;
}
第2步:实现写入方法
封装两个版本的写入方法,分别适用于带“节名”和无需指定节名(默认归入 default 节)的场景:
/// <summary>
/// 向特定节写入键值对
/// </summary>
public void writeIni(string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, this.iniPath);
}
/// <summary>
/// 默认在 default 节下写入键值对
/// </summary>
public void writeIni(string Key, string Value)
{
WritePrivateProfileString("default", Key, Value, this.iniPath);
}
第3步:实现读取方法
读取时,必须实例化一个 StringBuilder 对象作为缓存容器(此处分配了256字符长度),并将结果转换为字符串返回:
/// <summary>
/// 从特定节读取键的值
/// </summary>
public string readIni(string Section, string Key)
{
StringBuilder temp = new StringBuilder(256);
GetPrivateProfileString(Section, Key, "", temp, 256, this.iniPath);
return temp.ToString();
}
/// <summary>
/// 默认从 default 节读取值
/// </summary>
public string readIni(string Key)
{
return readIni("default", Key);
}
第4步:完善工具方法与完整性校验
添加一个判断INI文件是否存在的实用方法:
/// <summary>
/// 查询ini文件是否存在
/// </summary>
public bool existINIFile()
{
return File.Exists(iniPath);
}
}
第二步:测试与调用验证
创建控制台应用程序进行验证,测试代码将执行多组数据的写入和读取操作,确保配置能够正确持久化到磁盘文件中。
第5步:编写Program主程序
在 Main 方法中实例化 IniFile 对象,依次调用写入和读取逻辑:
class Program
{
static void Main(string[] args)
{
// 指定配置文件路径为 hello.ini
IniFile iniFile = new IniFile("./hello.ini");
// 写入带section的信息
iniFile.writeIni("section1", "key1", "value11");
iniFile.writeIni("section1", "key2", "value12");
iniFile.writeIni("section2", "key1", "value21");
iniFile.writeIni("section2", "key2", "value22");
// 写入不带section的信息(默认存储在 [default] 下)
iniFile.writeIni("key", "value");
// 验证读取操作是否正确
string str = iniFile.readIni("key");
Console.WriteLine(str); // 预期输出:value
Console.ReadKey();
}
}
总结
通过以上步骤,我们成功构建了一个轻量级的 IniFile 管理模块。这种方法利用了Windows底层的原生API接口,避免了第三方库的依赖,保证了代码的高效与稳定。需要注意的是,该方案仅针对Windows环境有效,若项目需要跨平台运行,建议结合 appsettings.json 或自定义格式的配置文件。
以上就是C#基于WinAPI读写INI配置文件的详细内容,更多关于C#配置管理开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









