C#读写INI配置文件:基于WinAPI的完整类封装与示例

林见深
林见深
发布时间:2026-10-13 | 2人浏览过
原创

在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#配置管理开发的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表