目录
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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。