C#读写配置文件(config.ini)
代码部分
配置文件(config.ini) 部分
winform部分
C#使用App.config和INI两种方式读写配置文件
说明
使用App.config
使用INI文件
总结
C#读写配置文件(config.ini)最近学习C#,遇到要读取配置文件的问题,记录下学习过程
代码部分namespace 写入读取配置文件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/*
* 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);
/*读配置文件*/
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 button1_Click_1(object sender, EventArgs e)
{
richTextBox1.Text = GetValue("参数", "波特率"); //这里通过界面的按钮,读取配置文件。
}
private void richTextBox1_TextChanged(object sender, EventArgs e)//当winform界面的数据更改时,自动保存到配置文件,以便下次打开时保持最后更改的数据
{
SetValue("参数", "波特率",this.richTextBox1.Text.ToString());
}
private void Form1_Load(object sender, EventArgs e)//程序开始自动读取上一次配置后的文件
{
richTextBox1.Text = GetValue("参数", "波特率"); //这里通过界面的按钮,读取配置文件。
}
}
}
配置文件(config.ini) 部分
winform部分
第一次启动如下图所示,点击按钮没有任何数据,需要先写入,如10,程序自动将10存入配置文件中。
关闭程序,再打开,文本框就有10了。
C#使用App.config和INI两种方式读写配置文件 说明将系统参数写到配置文件中,可避免修改参数必须重新打包程序问题。
c#操作配置文件有几种方法,下面分别介绍使用App.config和INI文件方式管理。
使用App.config注意:
程序编译后App.config会编译为“项目名.exe.config”文件。
程序中需要添加引用System.Configuration。
App.config可读写数据库连接参数和用户自定义参数。
读配置信息
App.config文件
<connectionStrings>
<add name="dbConnectionString" connectionString="Data Source=10.0.1.11;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=xxx;Max Pool Size=512" providerName="System.Data.SqlClient"/>
</connectionStrings>
<appSettings>
<add key="abc" value="welcome"/>
</appSettings>
读数据库配置信息
SqlConnection con = new SqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["dbConnectionString"].ConnectionString;
读自定义信息
String str = ConfigurationManager.AppSettings["abc"];
写配置信息
写配置信息要用到OpenExeConfiguration。
//获取可操作的Configuration对象
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
//写入<add>元素的Value
config.AppSettings.Settings["abc"].Value = "hello";
//保存
config.Save();
//刷新
ConfigurationManager.RefreshSection("appSettings");
使用INI文件
优点为配置文件可以指定路径,配置信息格式简单,使用系统库文件即可操作ini文件。
系统方法类
public class IniService
{
//引入系统库文件
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
[DllImport("kernel32.dll")]
private extern static int WritePrivateProfileSectionA(string segName, string sValue, string fileName);
public string iniPath;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="INIPath">文件路径</param>
public IniService(string INIPath)
{
iniPath = INIPath;
}
/// <summary>
/// 写入INI文件
/// </summary>
/// <param name="Section">项目名称(如 [TypeName] )</param>
/// <param name="Key">键</param>
/// <param name="Value">值</param>
public void IniWriteValue(string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, this.iniPath);
}
/// <summary>
/// 读出INI文件
/// </summary>
/// <param name="Section">项目名称(如 [TypeName] )</param>
/// <param name="Key">键</param>
public string IniReadValue(string Section, string Key)
{
StringBuilder temp = new StringBuilder(500);
int i = GetPrivateProfileString(Section, Key, "", temp, 500, this.iniPath);
return temp.ToString();
}
/// <summary>
/// 删除指定的节的所有内容
/// </summary>
/// <param name="Section">要删除的节的名字</param>
public void DeleteSection(string Section)
{
WritePrivateProfileSectionA(Section, null, this.iniPath);
}
/// <summary>
/// 验证文件是否存在
/// </summary>
/// <returns>布尔值</returns>
public bool isExistINIFile()
{
return File.Exists(iniPath);
}
}
测试
使用时需要指定ini文件位置,测试程序在工程中新建config文件夹,创建System.ini文件,并且右键属性中设置“如果较新则复制”。
//获取程序路径
string stCurrentPath = AppDomain.CurrentDomain.BaseDirectory;
if (!stCurrentPath.Substring(stCurrentPath.Length - 1).Equals(@"\"))
{
stCurrentPath = stCurrentPath + @"\";
}
//初始化IniService
IniService ini = new IniService(stCurrentPath + "config\\System.ini");
//写入System.ini
ini.IniWriteValue("Sys", "Msg","Welcome");
//读数据
string strInterval = ini.IniReadValue("Sys", "Msg");
配置文件
System.ini
总结[Sys]
Msg=Welcome
以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。