INI 文件操作详解笔记

发布于:2025-08-20 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、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 文件的特点

  1. 文本格式:纯文本文件,可直接用记事本等工具编辑,可读性强;

  2. 结构简单:仅通过 “节 - 键 - 值” 三层结构组织数据,易于理解和维护;

  3. 多层级节:支持多个独立节(如[Database][相机1]),方便按功能分组配置;

  4. 无数据类型:所有键值对均为字符串,读取后需手动转换为整数、布尔值等类型;

  5. 轻量依赖:无需复杂解析库,可通过系统 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

五、注意事项

  1. 路径配置App.config中的InIFilePath需确保程序有权限读写(建议使用相对路径,如"Config.ini"表示程序根目录);

  2. 数据类型转换:读取后需手动将字符串转换为目标类型(如int.Parse()bool.Parse());

  3. 系统依赖:因依赖kernel32.dll,该方法仅适用于 Windows 系统,跨平台(如 Linux)需使用其他库;

  4. 缓冲区大小Read方法中StringBuilder的容量(如 255)需根据实际配置值长度调整,避免截断。

六、总结

INI 文件以其简单的结构和易用性,成为 Windows 应用程序存储基础配置的优选格式。通过封装kernel32.dll的 API,C# 可高效实现 INI 文件的读写操作,适用于存储窗口位置、设备参数、数据库连接等无需复杂结构的配置信息。与 XML(重量级、复杂结构)和 JSON(轻量、跨平台)相比,INI 更适合简单场景,且易于人工编辑和维护。


网站公告

今日签到

点亮在社区的每一天
去签到