C# WinForms读写INI文件:使用Kernel32.dll实现配置管理

纸上星河
纸上星河
发布时间:2026-10-13 | 4人浏览过
原创

在需要轻量级本地配置的C# WinForms开发中,INI文件是一种经典的键值对存储格式。本文将演示如何利用Windows系统自带的 Kernel32.dll 中的非托管方法,在C#项目中实现对INI文件的节、键、值的高效读写。

结果与目标

完成一个C# WinForms窗体应用,包含若干输入框及读取、写入和清空按钮。点击读取按钮可从 Config.ini 文件加载数据填充界面;点击写入按钮可将界面上的内容保存至该文件。

准备条件

  1. 项目环境:Visual Studio C# Windows Forms (.NET Framework) 项目。
  2. INI文件结构:标准 [Section] 格式,建议使用ANSI编码以避免中文乱码问题(针对 .NET Framework)。
  3. 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窗体逻辑

目的:将界面控件与业务逻辑连接,处理加载、读取和写入的事件。

  1. 实例化路径:利用 Application.StartupPath 动态定位配置文件。注意转义反斜杠或使用 Path.Combine。
  2. Form_Load:初始化全局路径变量。
  3. Button_Read_Click:循环调用 IniFunc.getString,并将结果赋值给对应 TextBox 的 Text 属性。
  4. 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#配置文件优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表