文章目录
前言
上次楼主写了xml文件的读取与写入,但是楼主在浏览配置文件的时候发现有一种配置文件也是被经常用到的,那就是大名鼎鼎的ini文件,看到ini,是不是又想起了免安装版mysql的配置流程,在那里就有一个ini文件需要我们手动配置。今天我们在这篇文章中分享如何在C#中读取和写入ini文件。在这里楼主在查阅资料的时候看到了要操作这种类型的文件还涉及到一个非托管代码的知识点,由于时间紧,任务重,我在这里就先不深入了解了,先只了解一下读取与写入ini文件的用法,到时候用到的时候直接化身cv工程师就行了。
一、使用步骤
1.引入两行关键代码
代码如下(示例):
[DllImport("kernel32")]// 读配置文件方法的6个参数:所在的分区(section)、 键值、 初始缺省值、 StringBuilder、 参数长度上限 、配置文件路径
public static extern long GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder retVal, int size, string filePath);
[DllImport("kernel32")]//写入配置文件方法的4个参数: 所在的分区(section)、 键值、 参数值、 配置文件路径
private static extern long WritePrivateProfileString(string section, string key, string value, string filePath);
2.在可执行程序目录下新建一个ini文件
[参数]
波特率=90
COM=COM4
3.测试读取文件
private void btnReadIni_Click(object sender, EventArgs e)
{
textBox1.Text = GetValue("参数", "波特率");
}
/*读配置文件*/
public static string GetValue(string section, string key)
{
// ▼ 获取当前程序启动目录
// string strPath = Application.StartupPath + @"/config.ini"; 这里是绝对路径
string strPath = "./config.ini"; //这里是相对路径
if (File.Exists(strPath)) //检查是否有配置文件,并且配置文件内是否有相关数据。
{
StringBuilder sb = new StringBuilder(255);
GetPrivateProfileString(section, key, "配置文件不存在,读取未成功!", sb, 255, strPath);
return sb.ToString();
}
else
{
return string.Empty;
}
}
4.测试写入配置文件
/*写配置文件*/
public static void SetValue(string section, string key, string value)
{
// ▼ 获取当前程序启动目录
// string strPath = Application.StartupPath + @"/config.ini"; 这里是绝对路径
string strPath = "./config.ini"; //这里是相对路径,
WritePrivateProfileString(section, key, value, strPath);
}
private void btnWriterIni_Click(object sender, EventArgs e)
{
SetValue("参数", "COM", "COM4");
}
5.完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AutoLauch_ini
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnReadConfig_Click(object sender, EventArgs e)
{
/*string path = Application.StartupPath + @"\AppUser.config";
Configuration config = ConfigurationManager.OpenExeConfiguration(path);
ConfigurationSectionGroup csg = config.GetSectionGroup("/configuration/appSettings/add");
csg.Sections.*/
}
/*
* 1)private 不是必需的,根据设计了,public也可以.
* 2)extern 关键字表示该方法是要调用非托管代码.如果使用extern关键字来引入非托管代码,则必须也同时使用static.为什么要用static,
* 是因为你调用非托管代码,总得有个入口点吧,那么你声明的这个GetPrivateProfileString方法就是你要调用的非托管代码的入口.想想Main函数,
* 是不是也必须是static呢.
* 3) 为什么要用long,我看也有小伙伴也有用int的,估计是long支持的更多位数
*/
[DllImport("kernel32")]// 读配置文件方法的6个参数:所在的分区(section)、 键值、 初始缺省值、 StringBuilder、 参数长度上限 、配置文件路径
public static extern long GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder retVal, int size, string filePath);
[DllImport("kernel32")]//写入配置文件方法的4个参数: 所在的分区(section)、 键值、 参数值、 配置文件路径
private static extern long WritePrivateProfileString(string section, string key, string value, string filePath);
private void btnReadIni_Click(object sender, EventArgs e)
{
textBox1.Text = GetValue("参数", "波特率");
}
/*读配置文件*/
public static string GetValue(string section, string key)
{
// ▼ 获取当前程序启动目录
// string strPath = Application.StartupPath + @"/config.ini"; 这里是绝对路径
string strPath = "./config.ini"; //这里是相对路径
if (File.Exists(strPath)) //检查是否有配置文件,并且配置文件内是否有相关数据。
{
StringBuilder sb = new StringBuilder(255);
GetPrivateProfileString(section, key, "配置文件不存在,读取未成功!", sb, 255, strPath);
return sb.ToString();
}
else
{
return string.Empty;
}
}
/*写配置文件*/
public static void SetValue(string section, string key, string value)
{
// ▼ 获取当前程序启动目录
// string strPath = Application.StartupPath + @"/config.ini"; 这里是绝对路径
string strPath = "./config.ini"; //这里是相对路径,
WritePrivateProfileString(section, key, value, strPath);
}
private void btnWriterIni_Click(object sender, EventArgs e)
{
SetValue("参数", "COM", "COM4");
}
}
}
总结
特别感谢:
C#配置文件操作(ini、cfg、xml、config等格式)
C#读写配置文件(config.ini)入门
C#读写app.config中的数据
C#读写config配置文件
one more thing
楼主刚才测试了一下,用字符流或者字节流可以直接将ini文件中的内容直接读出来,在使用string中的各种方法,也是能对ini文件指定的key-value进行读取和赋值操作的,只不过麻烦了许多。注意特别注意字符编码的问题哦,否则读到的就是乱码,楼主用Encoding.utf-8 / ASCII /default 试了个遍,才将其读出来。
private void btn_Test_Click(object sender, EventArgs e)
{
string path = "./config.ini";
textBox1.Text = File.ReadAllText(path,Encoding.Default);
}