ini
Initialization
INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键值对(key-val)构成,常用于微软Windows操作系统中。
这种配置文件的文件扩展名多为INI
》》INI文件不支持数据类型,所有的键值对都是字符串类型。
这意味着在读取INI文件时,需要将字符串转换成对应的数据类型,例如整数、浮点数、布尔值等
csharp
[Database]
Server=127.0.0.1
Port=3306
Username=root
Password=xxx
Database=mydb
[Logging]
Level=INFO
File=/xxx.log
C#中有很多库可以用来读写Ini文件。以下是一些常用的C# ini库:
ini-parser:ini-parser是一个流行的开源库,可以轻松地读取、写入和修改Ini文件。它支持多个Ini文件的读取和写入,并提供了强大的查询功能。
Nini:Nini是另一个流行的开源Ini库,它提供了一个简单的API来读取和写入Ini文件。它支持多个Ini文件的读取和写入,以及多种Ini文件格式。
SimpleIni:SimpleIni是一个轻量级的Ini库,可以快速读取和写入Ini文件。它支持多个Ini文件的读取和写入,并提供了一些简单的查询功能。
csharp
using IniParser;
using IniParser.Model;
// 创建一个 IniData 对象来表示 INI 文件的内容
FileIniDataParser parser = new FileIniDataParser();
//========读取===============
IniData data = parser.ReadFile("xxx/file.ini");
// 访问 INI 文件中的配置信息
string value = data["SectionName"]["KeyName"];
Console.WriteLine(value);
//========写入===============
// 创建一个新的 IniData 对象,并设置配置信息
IniData newData = new IniData();
newData.Sections.AddSection("SectionName");
newData["SectionName"].AddKey("KeyName", "Value");
// 将 IniData 对象写入 INI 文件
parser.WriteFile("xxx/file.ini", newData);
//==============更新================
// 读取现有的 INI 文件
IniData data = parser.ReadFile("xxx/file.ini");
// 更新配置信息
data["SectionName"]["KeyName"] = "NewValue";
// 将更新后的配置写回文件
parser.WriteFile("xxx/file.ini", data);
///如删除配置项、删除部分、处理注释等也支持的
自己封装方法读取
csharp
using System.IO;
using System.Collections.Generic;
public static Dictionary<string, Dictionary<string, string>> ParseIniFile(string filePath)
{
Dictionary<string, Dictionary<string, string>> iniData = new Dictionary<string, Dictionary<string, string>>();
using (StreamReader reader = new StreamReader(filePath))
{
string section = "";
Dictionary<string, string> sectionData = new Dictionary<string, string>();
while (!reader.EndOfStream)
{
string line = reader.ReadLine().Trim();
if (line.StartsWith("[") && line.EndsWith("]"))
{
// 开始一个新的节
section = line.Substring(1, line.Length - 2);
sectionData = new Dictionary<string, string>();
iniData[section] = sectionData;
}
else if (line.Contains("="))
{
// 解析键值对
string[] parts = line.Split('=');
string key = parts[0].Trim();
string value = parts[1].Trim();
sectionData[key] = value;
}
}
}
return iniData;
}
csharp
Dictionary<string, Dictionary<string, string>> iniData = ParseIniFile("xxx.ini");
foreach (KeyValuePair<string, Dictionary<string, string>> section in iniData)
{
Console.WriteLine("[{0}]", section.Key);
foreach (KeyValuePair<string, string> kvp in section.Value)
{
Console.WriteLine("{0}={1}", kvp.Key, kvp.Value);
}
Console.WriteLine();
}
用window系统自带读取INI文件中的数据
C#命名空间中没有直接读写INI的类,但在"kernel32.dll"文件中有Win32的API函数--
WritePrivateProfileString()和GetPrivateProfileString(),可操作ini文件。
csharp
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace xxxx
{
public class ReadWriteINI
{
#region API函数声明
/// <summary>
/// 写入ini文件
/// </summary>
/// <param name="section">节点名称</param>
/// <param name="key">键</param>
/// <param name="val">值</param>
/// <param name="filePath">ini路径</param>
/// <returns>0失败/其他成功</returns>
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
/// <summary>
///
/// </summary>
/// <param name="section">节点名称,[]内的段落名</param>
/// <param name="key">键</param>
/// <param name="def">值(未读取到数据时设置的默认返回值)</param>
/// 对应API函数的def参数,它的值由用户指定,是当在配置文件中没有找到具体的Value时,就用def的值来代替。可以为空
/// <param name="retVal">读取到的结果值</param>
/// <param name="size">读取缓冲区大小</param>
/// <param name="filePath">ini配置文件的路径加ini文件名</param>
/// <returns>读取到的字节数量</returns>
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
#endregion
/// <summary>
/// 写INI,添加新节点、键值,及编辑修改键对应的值
/// </summary>
/// <param name="in_filename">ini配置文件的路径加ini文件名</param>
/// <param name="Section">节点名称,[]内的段落名</param>
/// <param name="Key">键</param>
/// <param name="Value">值</param>
public static bool IniFile_SetVal(string in_filename, string Section, string Key, string Value)
{
if (File.Exists(in_filename))
{
// 调用winapi函数将Key=Value写入Section节点下
long len = WritePrivateProfileString(Section, Key, Value, in_filename);
if (len == 0)
{
return false;
}
else
{
return true;
}
}
else
{
return true;
}
}
/// <summary>
/// 读ini
/// </summary>
/// <param name="in_filename">ini配置文件的路径加ini文件名</param>
/// <param name="Section">节点名称,[]内的段落名</param>
/// <param name="Key">键</param>
/// <returns></returns>
public static string IniFile_GetVal(string in_filename, string Section, string Key)
{
if (File.Exists(in_filename))
{
// 声明接收的数据
StringBuilder builder = new StringBuilder(1024);
// 调用winapi函数读取Section节点下Key的值
int len = GetPrivateProfileString(Section, Key, "", builder, 1024, in_filename);
if (len == 0)
return "1";
else
return (builder.ToString());
}
else
return string.Empty;
}
}
}
csharp
/// <summary>
/// 读取ini文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
string pathName = Application.StartupPath + "\\config\\xxx.ini";
string resStarter = ReadWriteINI.IniFile_GetVal(pathName, "section名", "key");
string[] resInitLine = resStarter.Split(',');
for (int ii = 0; ii < resInitLine.Length; ii++)
{
richTextBox2.AppendText(resInitLine[ii] + "\n");
}
}
/// <summary>
/// 写入ini文件,新建或编辑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
string pathName = Application.StartupPath + "\\xxx.ini";
ReadWriteINI.IniFile_SetVal(pathName, "section名", "key名", "值");
string[] resInitLine = richTextBox2.Lines;
string tempWrite = string.Join(",", resInitLine);
tempWrite=tempWrite.Remove(tempWrite.Length-1);
ReadWriteINI.IniFile_SetVal(pathName, "section名", "key名", tempWrite);
}
INI、
》》INI
》》xml
》》》json