C#读写INI文件的两种实现方式

阿橙
阿橙
发布时间:2026-10-14| 6人浏览过
原创

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

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。