C# 读写config配置文件

本文详细介绍了C#项目中的默认配置文件App.config、编译后生成的*.exe.config和*.vshost.exe.config的区别与操作方法,包括如何使用System.Configuration库进行配置文件的读写以及通过Application.StartupPath定位配置文件路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、项目默认配置文件

1、app.config

在创建C#项目时,visual studio会默认在项目路径创建一个名为 App.config 的程序集配置文件,其为开发时配置参数的文件,默认记录一些配置信息,当前 .NETFramework 的版本等。
在这里插入图片描述
在这里插入图片描述

2、*.exe.config

在项目编译后,会在根目录(相应 debug 或者 release 文件夹内)生成一个名为 ” 程序名称 .exe.config “ 的配置文件。当 app.config 文件有修改时,会重新复制 app.config 文件内容到 *.exe.config 和 *.vshost.exe.config 文件中,覆盖原始内容。
*.exe.config 文件为程序实际运行时实际操作的配置文件,在程序实际运行时无论怎么更改该配置文件,下一次运行时, *.exe.config 文件都会重新复制 app.config 文件,故该配置文件更改仅用于临时配置信息更改。
在这里插入图片描述

3、*.vshost.exe.config

在项目编译后,会在根目录(相应 debug 或者 release 文件夹内)生成一个名为 ” 程序名称.vshost.exe.config “ 的配置文件。
*.vshost.exe.config 文件为项目调试运行时实际操作的配置文件,在项目调试期间无论怎么更改该配置文件,在下一次运行时, *.vshost.exe.config 文件都会重新复制 app.config 文件,故该配置文件更改仅用于临时配置信息更改。
在这里插入图片描述

二、读写配置文件

1、添加 System.Configuration 程序集文件

系统程序集文件中有能操作 Config 文件的 API库文件,在项目 “引用” 上右键,点击“添加引用” ,打开“引用管理器”窗口。
在这里插入图片描述
在程序集中找到 System.Configuration ,选中后点击确定。将 System.Configuration 文件添加到项目引用中。
在这里插入图片描述

2、Config读取操作类函数

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FileOperationsDemo
{
    public static class ReadWriteConfig
    {
        #region 在系统配置文件中 读/写配置相关函数
        /// <summary>
        /// 从 *.exe.config 或 *.vshost.exe.config 文件中读取数据,返回字符串
        /// </summary>
        /// <param name="Setting_name"></param>
        /// <returns></returns>
        public static String Read_appSetting(String Setting_name)
        {
            String str = "";
            //获取Configuration对象
            Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            //根据Key读取<add>元素的Value
            str = config.AppSettings.Settings[Setting_name].Value;

            return str;
        }
        /// <summary>
        /// 从 *.exe.config 或 *.vshost.exe.config 文件中读取数据,处理后返回List列表
        /// </summary>
        /// <param name="Setting_name"></param>
        /// <returns></returns>
        public static List<String> Read_appSetting_List(String Setting_name)
        {
            String str = "";
            //获取Configuration对象
            Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            //根据Key读取<add>元素的Value
            str = config.AppSettings.Settings[Setting_name].Value;

            string[] tmp = str.Split(',');
            List<string> ret_list = new List<string>();

            ret_list.Clear();
            for (Int32 i = 0; i < tmp.Length; i++)
            {
                ret_list.Add(tmp[i]);
            }

            return ret_list;
        }
        /// <summary>
        /// 将配置写入 *.exe.config 或 *.vshost.exe.config 文件中
        /// </summary>
        /// <param name="Setting_name"></param>
        /// <param name="value"></param>
        public static void Write_appSetting(String Setting_name, String value)
        {
            //获取Configuration对象
            Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

            config.AppSettings.Settings[Setting_name].Value = value;   //写入<add>元素的Value

            //一定要记得保存,写不带参数的config.Save()也可以
            config.Save(ConfigurationSaveMode.Modified);
            刷新,否则程序读取的还是之前的值(可能已装入内存)
            System.Configuration.ConfigurationManager.RefreshSection("appSettings");
        }
        /// <summary>
        /// 将配置写入 *.exe.config 或 *.vshost.exe.config 文件中
        /// </summary>
        /// <param name="name"></param>
        /// <param name="Setting_name"></param>
        public static void Write_appSetting_List(String name, List<String> Setting_name)
        {
            String str = "";

            for (Int32 i = 0; i < Setting_name.Count - 1; i++)
            {
                str += Setting_name[i] + ",";
            }
            str += Setting_name[Setting_name.Count - 1];

            //获取Configuration对象
            Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

            config.AppSettings.Settings[name].Value = str;   //写入<add>元素的Value

            //一定要记得保存,写不带参数的config.Save()也可以
            config.Save(ConfigurationSaveMode.Modified);
            刷新,否则程序读取的还是之前的值(可能已装入内存)
            System.Configuration.ConfigurationManager.RefreshSection("appSettings");
        }
        #endregion

        #region appSettings 读/写配置相关函数 根据路径
        /// <summary>
        /// 从 path 指定文件中读取数据,返回字符串
        /// </summary>
        /// <param name="path"></param>
        /// <param name="Setting_name"></param>
        /// <returns></returns>
        public static String Read_appSettingPath(String path, String Setting_name)
        {
            String str = "";

            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = @path;
            //获取Configuration对象
            Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
            //根据Key读取<add>元素的Value
            str = config.AppSettings.Settings[Setting_name].Value;

            return str;
        }
        /// <summary>
        /// 从 path 指定文件中读取数据,返回字符串,处理后返回List列表
        /// </summary>
        /// <param name="path"></param>
        /// <param name="Setting_name"></param>
        /// <returns></returns>
        public static List<String> Read_appSettingPath_List(String path, String Setting_name)
        {
            String str = "";
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = @path;
            //获取Configuration对象
            Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
            //根据Key读取<add>元素的Value
            str = config.AppSettings.Settings[Setting_name].Value;

            string[] tmp = str.Split(',');
            List<string> ret_list = new List<string>();

            ret_list.Clear();
            for (Int32 i = 0; i < tmp.Length; i++)
            {
                ret_list.Add(tmp[i]);
            }

            return ret_list;
        }
        /// <summary>
        /// 将配置写入path路径的.config文件中
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="Setting_name">键</param>
        /// <param name="value">值</param>
        public static void Write_appSettingPath(String path, String Setting_name, String value)
        {
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = @path;
            //获取Configuration对象
            Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

            config.AppSettings.Settings[Setting_name].Value = value;   //写入<add>元素的Value

            //一定要记得保存,写不带参数的config.Save()也可以
            config.Save(ConfigurationSaveMode.Modified);
            刷新,否则程序读取的还是之前的值(可能已装入内存)
            System.Configuration.ConfigurationManager.RefreshSection("appSettings");
        }
        /// <summary>
        /// 将配置写入path路径的.config文件中
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="name">键</param>
        /// <param name="Setting_name">值</param>
        public static void Write_appSettingPath_List(String path, String name, List<String> Setting_name)
        {
            String str = "";

            for (Int32 i = 0; i < Setting_name.Count - 1; i++)
            {
                str += Setting_name[i] + ",";
            }
            str += Setting_name[Setting_name.Count - 1];

            ExeConfigurationFileMap map = new ExeConfigurationFileMap();

            map.ExeConfigFilename = @path;
            //获取Configuration对象
            Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

            config.AppSettings.Settings[name].Value = str;   //写入<add>元素的Value

            //一定要记得保存,写不带参数的config.Save()也可以
            config.Save(ConfigurationSaveMode.Modified);
            刷新,否则程序读取的还是之前的值(可能已装入内存)
            System.Configuration.ConfigurationManager.RefreshSection("appSettings");
        }
        ///<summary>  
        ///在path路径的.config文件中增加一对键值对  
        ///</summary>  
        ///<param name="newKey"></param>  
        ///<param name="newValue"></param>  
        public static void ADDAppConfig(String path, String newKey, String newValue)
        {
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = @path;
            //获取Configuration对象
            Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

            bool exist = false;
            foreach (string key in config.AppSettings.Settings.AllKeys)
            {
                if (key == newKey)
                {
                    exist = true;
                }
            }
            if (exist)
            {
                config.AppSettings.Settings.Remove(newKey);
            }
            config.AppSettings.Settings.Add(newKey, newValue);
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
        }
        #endregion
    }
}

3、使用用例

        /// <summary>
        /// 读取config文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            string serialPortCount = ReadWriteConfig.Read_appSetting("serialPortCount");
            richTextBox3.AppendText(serialPortCount + "\t\n");

            string Constr = ReadWriteConfig.Read_appSettingPath(Application.StartupPath + "\\config\\InitializeConfig.config", "修正器");
            richTextBox3.AppendText(Constr + "\t\n");
        }
        /// <summary>
        /// 写入config文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button6_Click(object sender, EventArgs e)
        {
            ReadWriteConfig.Write_appSetting("serialPortCount", richTextBox3.Text.ToString().Trim());

            string path = Application.StartupPath + "\\config\\InitializeConfig.config";
            ReadWriteConfig.Write_appSetting("serialPort1", richTextBox3.Lines[0].ToString().Trim());
            ReadWriteConfig.Write_appSettingPath(path, "修正器", richTextBox3.Lines[0].ToString().Trim());

            ReadWriteConfig.ADDAppConfig(path, "修正器11", richTextBox3.Lines[1].ToString().Trim());
        }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值