【CSharp】INI文件的简介及读写操作
简介
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文件的特点
简单易读:INI文件是纯文本文件,可以用任何文本编辑器打开和编辑。
层次结构:通过节(Section)将配置信息分组,便于管理。
轻量级:适合存储简单的配置信息,不需要复杂的解析器。
跨平台支持:虽然INI文件起源于Windows,但其格式简单,可以在其他操作系统中使用。
INI文件的优缺点
优点:
易于理解:结构简单,适合非技术人员编辑。
轻量级:文件体积小,加载速度快。
兼容性好:许多编程语言和操作系统都支持INI文件的读写。
缺点:
功能有限:不支持复杂的数据类型(如数组、嵌套结构)。
缺乏标准化:不同程序对INI文件的解析方式可能略有不同。
不适合大规模配置:对于需要存储大量复杂配置的场景,INI文件可能不够灵活。
INI文件的常见用途
应用程序配置:存储程序的设置,如窗口大小、语言、主题等。
游戏配置:存储游戏的图形设置、控制键位等。
硬件设备配置:存储设备的初始化参数。
脚本配置:为脚本程序提供运行参数。
读写文件教程
使用Windows API
需要导入
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(); } }
使用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); } }
运行结果
运行上述代码后,会在
C:\example.ini
文件中生成以下内容:[Settings] Username=Admin Password=123456 [Preferences] Theme=Dark
同时,控制台会输出
Username: Admin Password: 123456 Theme: Dark
使用第三方库ini-parser
安装
ini-parser
库:dotnet add package ini-parser
使用
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); } }
可根据实际业务需求对该库做进一步的封装:
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文件仍然是一个不错的选择。
- 感谢你赐予我前进的力量