一、INI 文件概述
INI 文件是一种轻量级的配置文件格式,主要用于 Windows 应用程序存储配置信息(如窗口设置、数据库连接、设备参数等)。它以文本形式存在,结构简单,易于人工编辑和维护,适用于不需要复杂数据类型或层级结构的场景。
二、INI 文件的结构与语法
INI 文件的核心结构由节(Section) 和键值对(Key-Value Pair) 组成,格式清晰直观:
1. 基本结构
[节名] ; 节(用方括号包裹,区分不同配置组) 键1=值1 ; 键值对(键与值用等号连接) 键2=值2 ... [另一节名] ; 支持多个节(多层级节) 键A=值A 键B=值B
2. 示例
[Database] ; 数据库配置节 Server=127.0.0.1 ; 数据库服务器地址 Port=3306 ; 端口号 Username=root ; 用户名 Password=123456 ; 密码 [Logging] ; 日志配置节 Level=INFO ; 日志级别 File=/var/log/myapp.log ; 日志路径 [相机1] ; 设备配置节(支持中文节名) 曝光=50 ; 曝光参数 亮度=100 ; 亮度参数 相机ip=192.168.1.100 ; IP地址
三、INI 文件的特点
文本格式:纯文本文件,可直接用记事本等工具编辑,可读性强;
结构简单:仅通过 “节 - 键 - 值” 三层结构组织数据,易于理解和维护;
多层级节:支持多个独立节(如
[Database]
、[相机1]
),方便按功能分组配置;无数据类型:所有键值对均为字符串,读取后需手动转换为整数、布尔值等类型;
轻量依赖:无需复杂解析库,可通过系统 API 直接操作(依赖 Windows 内核)。
四、C# 操作 INI 文件的步骤与实现
在 C# 中操作 INI 文件需借助 Windows 系统的kernel32.dll
动态链接库(提供底层 API),并封装为工具类方便调用。
1. 准备工作
(1)配置 INI 文件路径(通过 App.config)
在项目的App.config
(WinForm)或Web.config
(Web 应用)中配置 INI 文件的存储路径,便于统一管理:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <!-- 配置INI文件路径(相对路径或绝对路径) --> <add key="InIFilePath" value="Config.ini" /> </appSettings> </configuration>
(2)添加必要引用
需引用
System.Configuration
命名空间(用于读取App.config
配置),若项目中未包含,需手动添加: 右键项目→“添加”→“引用”→勾选 “System.Configuration”。
2. 封装 INI 操作工具类
创建工具类(如FileIni
),通过DllImport
特性调用kernel32.dll
的底层 API,实现 INI 文件的读写功能。
核心 API 说明
WritePrivateProfileString
:向 INI 文件写入键值对(位于kernel32.dll
);GetPrivateProfileString
:从 INI 文件读取键对应的值(位于kernel32.dll
)。
工具类完整代码
using System; using System.Text; using System.Runtime.InteropServices; // 用于DllImport特性 using System.Configuration; // 用于读取App.config namespace _06_INI文件操作.Utility { internal class FileIni { // 从App.config中读取INI文件路径 private static string filePath = ConfigurationManager.AppSettings["InIFilePath"].ToString(); // 导入kernel32.dll的WritePrivateProfileString函数(写入INI) [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool WritePrivateProfileString( string lpAppName, // 节名 string lpKeyName, // 键名 string lpString, // 值 string lpFileName // INI文件路径 ); // 导入kernel32.dll的GetPrivateProfileString函数(读取INI) [DllImport("kernel32.dll", CharSet = CharSet.Auto)] private static extern uint GetPrivateProfileString( string lpAppName, // 节名 string lpKeyName, // 键名 string lpDefault, // 默认值(未找到时返回) StringBuilder lpReturnedString, // 存储结果的字符串构建器 uint nSize, // 结果缓冲区大小 string lpFileName // INI文件路径 ); /// <summary> /// 向INI文件写入键值对 /// </summary> /// <param name="section">节名(如"Database")</param> /// <param name="key">键名(如"Server")</param> /// <param name="value">值(如"127.0.0.1")</param> public static void Write(string section, string key, string value) { WritePrivateProfileString(section, key, value, filePath); } /// <summary> /// 从INI文件读取键对应的值 /// </summary> /// <param name="section">节名</param> /// <param name="key">键名</param> /// <returns>键对应的值(字符串类型)</returns> public static string Read(string section, string key) { StringBuilder sb = new StringBuilder(255); // 缓冲区大小(根据需求调整) GetPrivateProfileString(section, key, "", sb, 255, filePath); return sb.ToString(); } } }
3. 使用工具类操作 INI 文件
(1)写入配置
// 向[相机1]节写入"曝光"和"亮度" FileIni.Write("相机1", "曝光", "50"); FileIni.Write("相机1", "亮度", "100"); // 向[Database]节写入"Server" FileIni.Write("Database", "Server", "192.168.1.1");
(2)读取配置
// 读取[相机1]节的"曝光"值 string exposure = FileIni.Read("相机1", "曝光"); // 返回"50" // 读取[Database]节的"Server"值 string dbServer = FileIni.Read("Database", "Server"); // 返回"192.168.1.1" // 转换数据类型(因INI值均为字符串) int exposureValue = int.Parse(exposure); // 转换为整数50
五、注意事项
路径配置:
App.config
中的InIFilePath
需确保程序有权限读写(建议使用相对路径,如"Config.ini"
表示程序根目录);数据类型转换:读取后需手动将字符串转换为目标类型(如
int.Parse()
、bool.Parse()
);系统依赖:因依赖
kernel32.dll
,该方法仅适用于 Windows 系统,跨平台(如 Linux)需使用其他库;缓冲区大小:
Read
方法中StringBuilder
的容量(如 255)需根据实际配置值长度调整,避免截断。
六、总结
INI 文件以其简单的结构和易用性,成为 Windows 应用程序存储基础配置的优选格式。通过封装kernel32.dll
的 API,C# 可高效实现 INI 文件的读写操作,适用于存储窗口位置、设备参数、数据库连接等无需复杂结构的配置信息。与 XML(重量级、复杂结构)和 JSON(轻量、跨平台)相比,INI 更适合简单场景,且易于人工编辑和维护。