应用程序配置文件可以分成:App.config和自定义的.config配置文件
备注:C#下的配置文件都是标准的XML文件。
创建winform项目之后会自动生成App.config文件,如果默认没有,可以在项目上右键–新建项–应用程序配置文件,命名为App.config。
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
startup>
<appSettings>
<add key="key1" value="hello"/>
<add key="key2" value="world!"/>
appSettings>
configuration>
其中里面的appSettings节点和子节点是后续添加的。
首先,项目的引用需要增加System.Configuration
,并在程序文件中添加using System.Configuration;
a. 添加键为keyName、值为keyValue的项
using System.Configuration;
public void addItem(string keyName, string keyValue)
{
//添加配置文件的项,键为keyName,值为keyValue
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Add(keyName, keyValue);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");//刷新命名节,这样在下次检索它时将从磁盘重新读取它。
}
b. 判断键值为KeyName的项是否存在
public bool existItem(string keyName)
{
//判断配置文件中是否存在键为keyName的项
foreach (string key in ConfigurationManager.AppSettings)
{
if (key == keyName)
{
//存在
return true;
}
}
return false;
}
c. 获取键值为KeyName的项的值
public string valueItem(string keyName)
{
//返回配置文件中键为keyName的项的值
return ConfigurationManager.AppSettings[keyName];
}
d. 修改键为keyName的项的值:
public void modifyItem(string keyName, string newKeyValue)
{
//修改配置文件中键为keyName的项的值
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[keyName].Value = newKeyValue;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
}
e. 删除键为KeyName的项
public void removeItem(string keyName)
{
//删除配置文件键为keyName的项
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Remove(keyName);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
}
备注:
在上一小结中,我们通过appSettings节点(由.Net预定义的配置节点)对App.config文件进行了配置,以及介绍了该节点下数据的操作。除此之外,我们可以通过两种方式来进行自定义配置文件。
可以通过configSections节点下设置section节点来自定义配置文件节点,具体如下:
注:configSection节点必须是根节点configuration下的第一个子节点。
<configuration>
<configSections>
<section name="Person" type="System.Configuration.NameValueSectionHandler"/>
<section name="Man" type="System.Configuration.DictionarySectionHandler"/>
<section name="Name" type="System.Configuration.SingleTagSectionHandler"/>
configSections>
<Person>
<add key="老大" value="刘备" />
<add key="老二" value="关羽" />
<add key="老三" value="张飞" />
Person>
<Man>
<add key="老大" value="曹操" />
<add key="老二" value="典韦" />
<add key="老三" value="郭嘉" />
Man>
<Name one="1" two="2" three="3" four="4" five="5" />
configuration>
其中Section节点里面的name是自定义节点的名称,type是接收配置节中的信息的数据类型。第一种方式可以使用.Net自带的几种数据类型进行装载数据,如:NameValue键值对、Dictionary字典和SingleTag基础结构。
using System.Collections.Specialized;
using System.Collections;
private static void getConfigs()
{
//读取人名
NameValueCollection nvc = (NameValueCollection)ConfigurationManager.GetSection("Person");
foreach (string key in nvc.AllKeys)
{
Console.WriteLine(key + ":" + nvc[key]);
}
//读取男人
IDictionary dict = (IDictionary)ConfigurationManager.GetSection("Man");
foreach (string key in dict.Keys)
{
Console.WriteLine(key + ":" + dict[key]);
}
IDictionary dict1 = (IDictionary)ConfigurationManager.GetSection("Name");
foreach (string key in dict1.Keys)
{
Console.WriteLine(key + ":" + dict1[key]);
}
}
后续添加
参见《C#配置文件之自定义节点》
以上的配置文件都是在App.config
中编辑操作的,当程序中存在大量的不同类型的配置项时,所有的都放在App.Config中会降低程序的可读性,为此我们需要将同类型的配置项放在自定义配置文件中进行分门别类。
具体实现:
App.config
文件连接到自定义配置文件custom1.config
App.config
<configuration>
<appSettings file="custom1.config"/>
configuration>
custom1.config
,其根目录为App.config
中调用的节点标签
<appSettings>
<add key="item1" value="first"/>
<add key="item2" value="second"/>
appSettings>
程序中调用
Console.WriteLine("Custom: " + ConfigurationManager.AppSettings["item1"]);
注:自定义配置文件不会像App.config
一样自动复制生产.exe.config,需要将custom1.config
文件的属性复制输出到目录设置为:始终复制或者如果较新则复制。
在自定义section
也可采用自定义配置文件
...
Framework.config文件
custom2.config
即在应用程序中直接调用custom2.config
文件,不通过App.config
连接调用。
custom2.config
,其根目录必须为configuration
<configuration>
<appSettings>
<add key="item1" value="AAA"/>
<add key="item2" value="BBB"/>
appSettings>
configuration>
程序中调用如下:
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = @"custom2.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
Console.WriteLine("custom2:"+ config.AppSettings.Settings["item1"].Value);
注:同样需要将custom2.config
文件的属性复制输出到目录设置为:始终复制或者如果较新则复制。
.settings
文件编辑.settings
设置文件是.Net
中可以进行可视化表单编辑的设置文件,其界面如下:
.settings
文件中有4个属性Name,Type,Scope,Value。重点讲一下Scope属性,Scope属性有两个值:应用程序(Application),用户(User)。这两者区别,Scope值为Application时,对应的Setting在运行时不可以修改。Scope值为User时,对应的Setting在运行时可以修改。
当设置完成.settings
文件后,我们可以发现在App.config
自动增加了一些内容,对应上图如下:
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="PropSettingTest.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
sectionGroup>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="PropSettingTest.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
sectionGroup>
configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
startup>
<userSettings>
<PropSettingTest.Properties.Settings>
<setting name="TitleUser" serializeAs="String">
<value>Hello Uservalue>
setting>
<setting name="BindingText" serializeAs="String">
<value>Hello PropBindingvalue>
setting>
PropSettingTest.Properties.Settings>
userSettings>
<applicationSettings>
<PropSettingTest.Properties.Settings>
<setting name="TitleApp" serializeAs="String">
<value>Hello Appvalue>
setting>
PropSettingTest.Properties.Settings>
applicationSettings>
configuration>
同样,当程序进行编译之后,.settings
文件中内容会保存在.exe.config
文件中。
.settings
在程序中调用//读取设置内容
string usertitle = Properties.Settings.Default.TitleUser;
string apptitle = Properties.Settings.Default.TitleApp;
//修改设置内容
Properties.Settings.Default.TitleUser = "Hello User";
Properties.Settings.Default.Save();
//当你尝试修改的属性范围为应用程序Application时,会提示不存在TitleApp的报错
//Properties.Settings.Default.TitleApp = "Hello App";
备注:
.settings
文件同一个工程中,可以添加多个 .settings
文件,每一个都会生成一个封装类,各对 App.config
中的一部分进行操作。
在添加.settings
文件时,可以放在Properties
目录下,也可以直接放在项目目录下,两者在程序中的调用会有一点区别
程序调用
//Properties目录下的.settings文件
string usertitle = Properties.Settings.Default.TitleUser;
//项目目录下的.settings文件
string title = @MySettings.Default.Title;
.settings
中属性的绑定我们可以将.settings
文件中的属性直接绑定到控件的某个属性上,具体操作如下
不过观察上图,在Properties
目录下的setting1.settings
文件内容并未出现在选项中,也就是只有Properties/setting.settings
文件和项目目录下的.settings
才能够进行属性绑定操作。
s文件
string usertitle = Properties.Settings.Default.TitleUser;
//项目目录下的.settings文件
string title = @MySettings.Default.Title;
### 4.3 `.settings`中属性的绑定
我们可以将`.settings`文件中的属性直接绑定到控件的某个属性上,具体操作如下
[外链图片转存中...(img-ZNYoJxvJ-1645175234191)]
不过观察上图,在`Properties`目录下的`setting1.settings`文件内容并未出现在选项中,也就是只有`Properties/setting.settings`文件和项目目录下的`.settings`才能够进行属性绑定操作。