C#读写INI文件的两种实现方式
C#标准库主要使用XML作为配置文件格式,但在对接老旧系统或特定工具时,常需读写INI文件。由于.NET本身未内置此类支持,通常借助平台调用(P/Invoke)技术访问底层Windows API实现。
结果与准备
本教程旨在解决如何在现代C#项目中操作传统的.ini配置文件。无需额外安装第三方库,仅需基础的系统引用即可实现读写功能。
准备条件
1. 项目环境: Windows操作系统(因涉及Win32 API)。
2. 命名空间: System.Runtime.InteropServices 用于声明外部函数,System.Text 用于StringBuilder。
第1步:通过P/Invoke调用系统API进行读写
目的: 使用最稳定、高效的原生接口完成操作。
入口: 新建一个Console应用或类库。
动作: 引入DllImport特性绑定kernel32.dll中的两个关键函数,并编写包装代码。
以下是完整的核心代码示例:Program.cs
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace INIDemo
{
class Program
{
static void Main(string[] args)
{
// 定义路径和参数
string iniPath = "c:\\demo.ini";
string section = "Demo";
string key = "abc";
string value = "123";
// 执行写操作
WritePrivateProfileString(section, key, value, iniPath);
// 执行读操作
StringBuilder temp = new StringBuilder(255);
GetPrivateProfileString(section, key, "", temp, temp.Capacity, iniPath);
Console.WriteLine($"从INI文件读取的值: {temp.ToString()}");
Console.ReadLine();
}
// 导入写函数
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern bool WritePrivateProfileString(
string lpAppName, string lpKeyName, string lpString, string lpFileName);
// 导入读函数
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern int GetPrivateProfileString(
string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString,
int nSize, string lpFileName);
}
}
重要参数说明:
- lpAppName: INI文件中的节(Section)名称。
- lpKeyName: 键名(Key)。
- lpString: (仅Write) 要写入的键值。
- lpReturnedString: (仅Read) 接收返回结果的StringBuilder实例。
- nSize: (仅Read) lpReturnedString的最大字符容量。
- lpFileName: INI文件的路径及文件名。
可观察的完成状态: 运行后控制台正确输出“123”,且磁盘指定目录下生成对应的INI文件片段:
[Demo]
abc=123
]
第2步:封装通用的INI辅助类
目的: 将API调用封装为面向对象的结构,便于在项目中复用。
动作: 创建一个名为IniHelper.cs的类文件。
using System.Runtime.InteropServices;
using System.Text;
public class IniHelper
{
// 声明WIN32 API函数
[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);
private string sPath = null;
public IniHelper(string path)
{
this.sPath = path;
}
public void Write(string section, string key, string value)
{
WritePrivateProfileString(section, key, value, sPath);
}
public string ReadValue(string section, string key)
{
StringBuilder temp = new StringBuilder(255);
GetPrivateProfileString(section, key, "", temp, 255, sPath);
return temp.ToString();
}
}
该方案通过构造函数传入文件路径,提供了简洁的公共方法,解决了直接调用API时的冗余问题。
原文有依据的排错
- 非托管限制: C#本身不包含读写.ini的内建方法,必须依赖Windows内核组件,因此仅在Windows环境下有效,跨平台移植时需替换为XML或JSON解析逻辑。
- 字符编码: 上述代码使用
CharSet.Unicode,这要求你的.ini文件应当保存为UTF-16LE(Windows默认),否则中文内容可能出现乱码。如果使用的是UTF-8文本,可能需要调整代码页设置或使用专门的解析器。
简要总结
以上就是C#中读写INI文件的详细内容,主要通过调用Win32 API实现了高效的数据交互。更多关于C#配置文件管理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









