简介

INI文件是一种常见的配置文件格式,通常用于存储应用程序的配置信息。它的名称来源于“Initialization”(初始化),因为这种文件通常用于在程序启动时加载初始配置。INI文件以文本形式存储,结构简单、易于阅读和编辑,因此在早期的Windows应用程序中广泛使用。

INI文件的基本结构

INI文件由多个节(Section)和键值对(Key-Value Pair)组成,格式如下:

[Section1]
Key1=Value1
Key2=Value2

[Section2]
Key3=Value3
Key4=Value4
  • 节(Section):用方括号[]​括起来,表示一个配置分组。例如:

    [Settings]
  • 键值对(Key-Value Pair):每个键值对占一行,格式为Key=Value​。例如:

    Username=Admin
    Password=123456

INI文件的特点

  1. 简单易读:INI文件是纯文本文件,可以用任何文本编辑器打开和编辑。

  2. 层次结构:通过节(Section)将配置信息分组,便于管理。

  3. 轻量级:适合存储简单的配置信息,不需要复杂的解析器。

  4. 跨平台支持:虽然INI文件起源于Windows,但其格式简单,可以在其他操作系统中使用。

INI文件的优缺点

优点

  • 易于理解:结构简单,适合非技术人员编辑。

  • 轻量级:文件体积小,加载速度快。

  • 兼容性好:许多编程语言和操作系统都支持INI文件的读写。

缺点

  • 功能有限:不支持复杂的数据类型(如数组、嵌套结构)。

  • 缺乏标准化:不同程序对INI文件的解析方式可能略有不同。

  • 不适合大规模配置:对于需要存储大量复杂配置的场景,INI文件可能不够灵活。

INI文件的常见用途

  1. 应用程序配置:存储程序的设置,如窗口大小、语言、主题等。

  2. 游戏配置:存储游戏的图形设置、控制键位等。

  3. 硬件设备配置:存储设备的初始化参数。

  4. 脚本配置:为脚本程序提供运行参数。

读写文件教程

使用Windows API

  1. 需要导入kernel32.dll​中的相关函数来操作INI文件。

    using System;
    using System.Runtime.InteropServices;
    using System.Text;
    
    class IniFile
    {
        private string filePath;
    
        // 导入Windows API函数
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string value, string filePath);
    
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder retVal, int size, string filePath);
    
        // 构造函数,传入INI文件路径
        public IniFile(string path)
        {
            filePath = path;
        }
    
        // 写入INI文件
        public void Write(string section, string key, string value)
        {
            WritePrivateProfileString(section, key, value, filePath);
        }
    
        // 读取INI文件
        public string Read(string section, string key, string defaultValue = "")
        {
            StringBuilder retVal = new StringBuilder(255);
            GetPrivateProfileString(section, key, defaultValue, retVal, 255, filePath);
            return retVal.ToString();
        }
    }
  2. 使用INI文件读写类

    class Program
    {
        static void Main(string[] args)
        {
            // 指定INI文件路径
            string iniFilePath = @"C:\example.ini";
    
            // 创建IniFile对象
            IniFile iniFile = new IniFile(iniFilePath);
    
            // 写入数据到INI文件
            iniFile.Write("Settings", "Username", "Admin");
            iniFile.Write("Settings", "Password", "123456");
            iniFile.Write("Preferences", "Theme", "Dark");
    
            // 从INI文件读取数据
            string username = iniFile.Read("Settings", "Username");
            string password = iniFile.Read("Settings", "Password");
            string theme = iniFile.Read("Preferences", "Theme", "Light"); // 如果不存在,返回默认值"Light"
    
            // 输出读取的值
            Console.WriteLine("Username: " + username);
            Console.WriteLine("Password: " + password);
            Console.WriteLine("Theme: " + theme);
        }
    }
  3. 运行结果

    运行上述代码后,会在C:\example.ini​文件中生成以下内容:

    [Settings]
    Username=Admin
    Password=123456
    
    [Preferences]
    Theme=Dark

    同时,控制台会输出

    Username: Admin
    Password: 123456
    Theme: Dark
    

使用第三方库ini-parser

  1. 安装ini-parser库:

    dotnet add package ini-parser
  2. 使用ini-parser读写INI文件:

    using IniParser;
    using IniParser.Model;
    
    class Program
    {
        static void Main(string[] args)
        {
            string iniFilePath = @"C:\example.ini";
    
            // 读取INI文件
            var parser = new FileIniDataParser();
            IniData data = parser.ReadFile(iniFilePath);
    
            // 写入数据
            data["Settings"]["Username"] = "Admin";
            data["Settings"]["Password"] = "123456";
            data["Preferences"]["Theme"] = "Dark";
    
            // 保存INI文件
            parser.WriteFile(iniFilePath, data);
    
            // 读取数据
            string username = data["Settings"]["Username"];
            string password = data["Settings"]["Password"];
            string theme = data["Preferences"]["Theme"];
    
            Console.WriteLine("Username: " + username);
            Console.WriteLine("Password: " + password);
            Console.WriteLine("Theme: " + theme);
        }
    }
  3. 可根据实际业务需求对该库做进一步的封装:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using IniParser;
    using IniParser.Model;
    
    namespace UtilityClass
    {
        public class IniFileUtil
        {
            private readonly string _filePath;
            private readonly FileIniDataParser _parser;
            private readonly Encoding _encoding;
    
            public IniFileUtil(string filePath, Encoding encoding = null)
            {
                _filePath = filePath;
                _parser = new FileIniDataParser();
                _encoding = encoding ?? Encoding.UTF8;
            }
    
            /// <summary> 读取INI文件 </summary>
            public IniData Read()
            {
                // 使用指定编码读取文件内容
                string iniContent;
                using (var reader = new StreamReader(_filePath, _encoding))
                {
                    iniContent = reader.ReadToEnd();
                }
    
                // 解析 INI 内容
                return _parser.Parser.Parse(iniContent);
            }
    
            /// <summary> 写入INI文件 </summary>
            public void Write(IniData data)
            {
                // 使用指定编码写入文件
                using (var writer = new StreamWriter(_filePath, false, _encoding))
                {
                    _parser.WriteData(writer, data);
                }
            }
    
            /// <summary> 获取指定键的值 </summary>
            public string GetValue(string section, string key)
            {
                var data = Read();
                return data[section]?[key];
            }
    
            /// <summary> 设置指定键的值 </summary>
            public void SetValue(string section, string key, string value)
            {
                var data = Read();
                if (data[section] == null)
                {
                    data.Sections.AddSection(section);
                }
                data[section][key] = value;
                Write(data);
            }
    
            /// <summary> 删除指定键 </summary>
            public void DeleteKey(string section, string key)
            {
                var data = Read();
                if (data[section] != null && data[section].ContainsKey(key))
                {
                    data[section].RemoveKey(key);
                    Write(data);
                }
            }
    
            /// <summary> 删除指定节 </summary>
            public void DeleteSection(string section)
            {
                var data = Read();
                if (data.Sections.ContainsSection(section))
                {
                    data.Sections.RemoveSection(section);
                    Write(data);
                }
            }
        }
    }

总结

INI文件是一种简单、轻量级的配置文件格式,适合存储基本的配置信息。虽然它在现代应用程序中逐渐被更强大的格式取代,但在某些场景下仍然有其独特的优势。如果你需要快速存储和读取简单的配置信息,INI文件仍然是一个不错的选择。