C# WinForms读写INI文件:使用Kernel32.dll实现配置管理
在需要轻量级本地配置的C# WinForms开发中,INI文件是一种经典的键值对存储格式。本文将演示如何利用Windows系统自带的 Kernel32.dll 中的非托管方法,在C#项目中实现对INI文件的节、键、值的高效读写。
结果与目标
完成一个C# WinForms窗体应用,包含若干输入框及读取、写入和清空按钮。点击读取按钮可从 Config.ini 文件加载数据填充界面;点击写入按钮可将界面上的内容保存至该文件。
准备条件
- 项目环境:Visual Studio C# Windows Forms (.NET Framework) 项目。
- INI文件结构:标准
[Section]格式,建议使用ANSI编码以避免中文乱码问题(针对 .NET Framework)。 - P/Invoke 能力:允许在非托管代码层调用 Windows API。
第1步:创建并确定INI文件位置与编码
目的:建立待操作的配置文件,并确保路径正确且编码兼容早期API。
- 操作入口:项目根目录或应用程序运行目录(如
bin\Debug)。 - 文件内容示例:
[Information] Name=周星星 Gender=男 Age=55 Region=香港 - 重要参数:确保文本编辑器保存时选用 “ANSI” 或 “Chinese Simplified (GB2312)” 编码,否则在 .NET Framework 4.x 下可能出现字符截断。
- 可观察状态:确认文件中包含
[Information]节及对应的键值对。
第2步:构建INI操作管理类 (IniFunc)
目的:封装底层 API 调用,提供健壮的字符串读写接口。
C# 提供了 System.Runtime.InteropServices 命名空间用于导入DLL。我们需要定义两个核心函数:GetPrivateProfileString 用于读取,WritePrivateProfileString 用于写入。
以下是具体的工具类实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Test1
{
public static class IniFunc
{
/// <summary>
/// 获取值
/// </summary>
/// <param name="section">段落名</param>
/// <param name="key">键名</param>
/// <param name="defval">读取异常是的缺省值</param>
/// <param name="retval">键名所对应的的值,没有找到返回空值</param>
/// <param name="size">返回值允许的大小</param>
/// <param name="filepath">ini文件的完整路径</param>
/// <returns></returns>
[DllImport("kernel32.dll")]
private static extern int GetPrivateProfileString(
string section,
string key,
string defval,
StringBuilder retval,
int size,
string filepath);
/// <summary>
/// 写入
/// </summary>
/// <param name="section">需要写入的段落名</param>
/// <param name="key">需要写入的键名</param>
/// <param name="val">写入值</param>
/// <param name="filepath">ini文件的完整路径</param>
/// <returns></returns>
[DllImport("kernel32.dll")]
private static extern int WritePrivateProfileString(
string section,
string key,
string val,
string filepath);
/// <summary>
/// 获取数据
/// </summary>
/// <param name="section">段落名</param>
/// <param name="key">键名</param>
/// <param name="def">没有找到时返回的默认值</param>
/// <param name="filename">ini文件完整路径</param>
/// <returns></returns>
public static string getString(string section, string key, string def, string filename)
{
StringBuilder sb = new StringBuilder(1024);
GetPrivateProfileString(section, key, def, sb, 1024, filename);
return sb.ToString();
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="section">段落名</param>
/// <param name="key">键名</param>
/// <param name="val">写入值</param>
/// <param name="filename">ini文件完整路径</param>
public static void writeString(string section, string key, string val, string filename)
{
WritePrivateProfileString(section, key, val, filename);
}
}
}
- 重点说明:
StringBuilder的容量(此处为1024)决定了能读取的最大字段长度,需根据实际业务调整。
第3步:编写WinForms窗体逻辑
目的:将界面控件与业务逻辑连接,处理加载、读取和写入的事件。
- 实例化路径:利用
Application.StartupPath动态定位配置文件。注意转义反斜杠或使用Path.Combine。 - Form_Load:初始化全局路径变量。
- Button_Read_Click:循环调用
IniFunc.getString,并将结果赋值给对应TextBox的Text属性。 - Button_Write_Click:从各
TextBox获取文本,调用IniFunc.writeString覆写对应键值。
核心交互代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Test1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string filename = null;
private void Form1_Load(object sender, EventArgs e)
{
// 拼接完整路径,注意使用 \ 作为分隔符或 Path.Combine
filename = Application.StartupPath + "\\Config.ini";
}
/// <summary>
/// 读取
/// </summary>
private void Button_Read_Click(object sender, EventArgs e)
{
// 提取指定 Section 和 Key 的值
string names = IniFunc.getString("Information", "Name", null, filename);
string gender = IniFunc.getString("Information", "Gender", null, filename);
string age = IniFunc.getString("Information", "Age", null, filename);
string region = IniFunc.getString("Information", "Region", null, filename);
// 填充UI控件
TextBox_Name.Text = names;
TextBox_Gender.Text = gender;
TextBox_Age.Text = age;
TextBox_Region.Text = region;
}
/// <summary>
/// 写入
/// </summary>
private void Button_Write_Click(object sender, EventArgs e)
{
// 提取UI控件内容
string names = TextBox_Name.Text;
string gender = TextBox_Gender.Text;
string age = TextBox_Age.Text;
string region = TextBox_Region.Text;
// 写入到Ini文件
IniFunc.writeString("Information", "Name", names, filename);
IniFunc.writeString("Information", "Gender", gender, filename);
IniFunc.writeString("Information", "Age", age, filename);
IniFunc.writeString("Information", "Region", region, filename);
}
/// <summary>
/// 清空
/// </summary>
private void Button_Clear_Click(object sender, EventArgs e)
{
TextBox_Name.Text = string.Empty;
TextBox_Gender.Text = string.Empty;
TextBox_Age.Text = string.Empty;
TextBox_Region.Text = string.Empty;
}
}
}
完成判断与排错
完成判断: 运行程序,填写输入框后点击“写入”,检查同级目录下是否生成或更新了 Config.ini 文件。再次重启程序点击“读取”,界面应显示刚才保存的内容。
排错建议:
- 读不到数据:通常是INI文件路径错误(相对路径问题),或者INI文件编码不是ANSI导致字符被截断。
- 写入未生效:检查是否有权限问题,但通常StartupPath是可写的。此外,确认
key拼写完全一致。
总结
通过以上步骤,我们实现了C# WinForms中对INI文件的标准读写。这种方法依赖操作系统底层支持,不需要引入第三方NuGet包即可快速落地。以上就是C#实现读写ini文件详细内容,更多关于C#配置文件优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













