注:从网上收集整理了关于C#中配置文件的资料,还加加入了自己的一些理解,希望能给大家一点帮助,如有错漏,恳请指出。
程序配置文件实质上是应用程序的一种针对配置信息读写最简单的工具。它重要的功能就是将命令行选项和配置文件选项统一到一种数据结构中,这样的话可以在外部设置参数,而无须修改代码来达到我们想要的效果。配合上配置文件的读写接口,操作上也较为方便。
过去常见的配置文件是以“.ini”为后缀的文本文件。INI,是英文“初始化(Initial)”的缩写。正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。格式上主要分为“节”、“参数”和“注解”三部分。后来由于Windows95推出了注册表的概念,INI配置文件在系统中的地位就大不如前了。不过作为应用程序的配置读写来说,INI还是有其牢固的地位的。
后来XML的发展也为配置文件提供了一种更好的存储格式。常见到的“config”文件扩展名的文件,也是在C#编程中较为常用的。
C#的配置文件在编码阶段,可通过添加新项找到(名为“应用程序配置文件”),添加入项目后名为app.config,程序编译后一般是以“程序名”+“.exe”+“.config”命名的文件出现。config文件的内容与配置相关的分为两大部分,一部分为应用程序的配置节(appSettings),另一部分为连接字符串的配置节(connectionStrings)。可使用C#提供的ConfigurationManager(原先使用ConfigureationSettings,现已弃用)进行读取。ConfigurationManager中比较重要的是AppSettings和ConnectionStrings两个属性,分别负责读取应用程序的配置项(appSettings)和连接字符串的配置项(connectionStrings)。如果要修改配置文件项,需要先通过ConfigurationManager的OpenExeConfigureation()方法读取信息到Configuration类中,再修改其中对应项的信息,然后执行保存,最后如果要将结果调用出来,还需要ConfigurationManager调用RefreshSection()方法进行刷新。
以上是对配置文件一些简单的介绍。下面我们来详细看一下配置文件的各种功能和用法。
INI配置文件以”ini”为文件扩展名,内容格式为:节、参数和注解。
每一个INI文件构成都非常类似,由若干段落(section)组成,在每个带括号的标题下面,是若干个以单个单词开头的关键词(keyword)和一个等号,等号右边的就是关键字对应的值(value)。其一般形式如下:
[Section1]
KeyWord1 =Valuel
KeyWord2 =Value2
……
[Section2]
KeyWord3 =Value3
KeyWord4 =Value4
[section]
name=value
注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。
如:
; comment text
C#操作INI文件使用的是Windows系统自带Win32的API函数——WritePrivateProfileString()和GetPrivateProfileString()函数。这二个函数都位于“kernel32.dll”文件中。C#中对Win32的API函数的互操作是通过命名空间“System.Runtime.InteropServices”中的“DllImport”特征类来实现的。它的主要作用是指示此属性化方法是作为非托管DLL的输出实现的。
[ DllImport ("kernel32" ) ]
private static extern intGetPrivateProfileString ( string section ,
string key , string def , StringBuilder retVal ,
int size , string filePath ) ;
参数说明:section:INI文件中的段落名称;key:INI文件中的关键字;def:无法读取时候时候的缺省数值;retVal:读取数值;size:数值的大小;filePath:INI文件的完整路径和名称。
[ DllImport ( "kernel32" ) ]
private static extern longWritePrivateProfileString ( string
section ,
string key , string val , string filePath );
参数说明:section:INI文件中的段落;key:INI文件中的关键字;val:INI文件中关键字的数值;filePath:INI文件的完整的路径和名称。
下面是自行编写的一个读写INI文件的类
class IniFile
{
//绝对路径(默认执行程序目录)
public stringFilePath { get; set;}
///
///读取ini文件
///
///段落名
///键
///缺省值
///所对应的值,如果该key不存在则返回空值
///值允许的大小
///INI文件的完整路径和文件名
///
[DllImport("kernel32")]
private static extern intGetPrivateProfileString(
string section, stringkey, string defVal,
StringBuilder retVal,intsize, string filePath);
///
///写入ini文件
///
///段落名
///键
///值
///INI文件的完整路径和文件名
///
[DllImport("kernel32")]
private static extern longWritePrivateProfileString(
string section, stringkey, string val, stringfilePath);
#region 静态方法
public static string ReadVal(stringsection,string key, stringfilePath)
{
string defVal = "";
StringBuilder retVal =newStringBuilder();
int size = 10240;
string rt = "";
try
{
GetPrivateProfileString(section, key, defVal, retVal, size, filePath);
rt = retVal.ToString();
}
catch
{
rt = "";
}
return rt;
}
public static bool WriteVal(stringsection,string key, stringval,string filePath)
{
try
{
if (WritePrivateProfileString(section,key, val, filePath) == 0)
return false;
else
return true;
}
catch
{
return false;
}
}
#endregion
#region 对象方法
public stringReadVal(string section, string key)
{
string defVal = "";
StringBuilder retVal =newStringBuilder();
int size = 10240;
string rt = "";
try
{
GetPrivateProfileString(section, key,
defVal, retVal, size, this.FilePath);
rt = retVal.ToString();
}
catch
{
rt = "";
}
return rt;
}
public bool WriteVal(string section, stringkey, string val)
{
try
{
WritePrivateProfileString(section, key, val, this.FilePath);
return true;
}
catch
{
return false;
}
}
#endregion
}
configuration为根节点,其下可以带有appSettings和connectionStrings两个子节点。
另外需要注意的是这两个子节点中配置项的名称和值并不一样,appSettings中为“key”和“value”,connectionStrings中为“name”和“connectionString”。
粗略为如下所示:
一个完整的config配置文件内容:
xmlversion="1.0"?>
<configuration>
<startup>
<supportedRuntimeversion="v4.0"sku=".NETFramework,Version=v4.0"/>
startup>
<appSettings>
<addkey="test1"value="test1's value is test1!"/>
<addkey="test2"value="test2's value is test2!"/>
appSettings>
<connectionStrings>
<addname="sql1"connectionString="server=127.0.0.1; database=testdb; uid=sa; pwd=sa"/>
connectionStrings>
configuration>
config文件中appSettings的读取主要依靠ConfigurationManager类提供的两个属性:AppSettings和ConnectionStrings,通过字符串索引获取对应配置项的内容。
config文件中appSettings的读取主要依靠ConfigurationManager类提供的属性:AppSettings,通过字符串索引获取对应配置项的内容。
而写入操作,必须要先读取配置到一个特定的配置对象中,再作修改和保存。
通过ConfigurationManager.AppSettings[key]读取
例子:
public static string GetAppSetting(stringkey)
{
string s = "";
try
{
s = ConfigurationManager.AppSettings[key];
}
catch { }
return s;
}
写入需要将配置文件读取到Configuration对象中,然后在其中修改,最后保存。
另外注意,Configuration类是没有构造函数的,需要使用ConfigurationManager类的OpenExeConfiguration()方法打开。
与3.3.2.1 connectionStrings的打开相同
1、 打开当前程序的配置文件。
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
2、 打开指定路径的配置文件。
ConfigurationManager.OpenExeConfiguration(string exePath)
config.AppSettings.Settings[key].Value = value; //修改对应项
config.Save(ConfigurationSaveMode.Modified);//保存
ConfigurationManager.RefreshSection("appSettings"); //刷新配置文件管理类
config.AppSettings.Settings.Add(key, value); //添加
//后续保存、刷新不累赘
config.AppSettings.Settings.Remove(key); //删除
//后续保存、刷新不累赘
通过获取配置对象的指定节,在节上进行写入操作。
下面的修改为例(注:添加和删除也大同小异)
AppSettingsSection appSettings =(AppSettingsSection)m_Config.GetSection("appSettings");
appSettings.Settings[key].Value = value;
m_Config.Save();
config文件中connectionStrings的读取跟appSettings类似,也要依靠ConfigurationManager类提供的属性,这个属性为ConnectionStrings。
写入操作也类同。
ConfigurationManager.ConnectionStrings[name].ConnectionString
参照3.2.2.1
config.ConnectionStrings.ConnectionStrings[name].ConnectionString= connectionString;
//config.ConnectionStrings.ConnectionStrings[name].ProviderName= providerName; //该项可选
ConnectionStringSettings connSetting =new ConnectionStringSettings(name, connectionString, providerName);//生成项 config.ConnectionStrings.ConnectionStrings.Add(connSetting);//添加
//后续保存、刷新
m_Config.ConnectionStrings.ConnectionStrings.Remove(ConnectionStringSettings item); //通过指定项删除 m_Config.ConnectionStrings.ConnectionStrings.Remove(name);//通过名称删除
直接上例子:
ConnectionStringsSection connSection =(ConnectionStringsSection)m_Config.GetSection("connectionStrings");
connSection.ConnectionStrings[name].ConnectionString= connectionString;
m_Config.Save();
利用Configuration的GetSection()方法,获取后操作。
直接上源代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
namespace TestConfig1
{
class ConfigMgr
{
///如需要使用ConfigurationManager类还必须在“引用”中,引用System.Configuration
///ConfigurationSettings只是针对旧版的兼容(向下兼容),不建议使用
///配置文件
privatestaticConfigurationm_Config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); //读取当前程序的配置文件
///
///
///
///
///
public static stringGetAppSetting(string key)
{
strings = "";
try
{
s = ConfigurationManager.AppSettings[key];
}
catch{ }
returns;
}
public static stringGetConnString(string name)
{
strings = "";
try
{
if(ConfigurationManager.ConnectionStrings[name]!=null)
s = ConfigurationManager.ConnectionStrings[name].ConnectionString;
}
catch{ }
returns;
}
///
///定义设置当前或者其他应用程序配置文件中的appSettings节点,通过AppSettings属性
///
///
///
public static boolSetAppSetting1(string key,string value)
{
try
{
if(m_Config.AppSettings.Settings[key] !=null)
{
m_Config.AppSettings.Settings[key].Value = value;
}
else
{
m_Config.AppSettings.Settings.Add(key, value);
}
m_Config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
returntrue;
}
catch
{
returnfalse;
}
}
///
///定义设置当前或者其他应用程序配置文件中的appSettings节点
///
///
///
public static voidSetAppSetting(string key,string value)
{
AppSettingsSectionappSettings = (AppSettingsSection)m_Config.GetSection("appSettings");
if(appSettings.Settings[key] !=null)
{
appSettings.Settings[key].Value= value;
m_Config.Save();
}
else
{
appSettings.Settings.Add(key,value);
m_Config.Save();
}
ConfigurationManager.RefreshSection("appSettings");
}
///
///定义设置当前或者其他应用程序配置文件中的connectionStrings节点,通过ConnectionStrings属性
///
///
///
public static boolSetConnectionString1(string name,string connectionString, stringproviderName = "System.Data.SqlClient")
{
try
{
if(m_Config.ConnectionStrings.ConnectionStrings[name] !=null)
{
m_Config.ConnectionStrings.ConnectionStrings[name].ConnectionString =connectionString;
m_Config.ConnectionStrings.ConnectionStrings[name].ProviderName =providerName;
//m_Config.Save(ConfigurationSaveMode.Modified);
}
else
{
ConnectionStringSettingsconnSetting =new ConnectionStringSettings(name,connectionString, providerName);
m_Config.ConnectionStrings.ConnectionStrings.Add(connSetting);
//config.Save(ConfigurationSaveMode.Modified);
}
m_Config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("connectionStrings");
returntrue;
}
catch
{
returnfalse;
}
}
///
///定义设置当前或者其他应用程序配置文件中的connectionStrings节点
///
///
///
public static voidSetConnectionString(string name,string connectionString, stringproviderName = "System.Data.SqlClient")
{
//通过获取对应的节来操作实现
//providerName= "System.Data.SqlClient"
ConnectionStringsSectionconnSection = (ConnectionStringsSection)m_Config.GetSection("connectionStrings");
if(connSection.ConnectionStrings[name] !=null)
{
connSection.ConnectionStrings[name].ConnectionString = connectionString;
m_Config.Save();
}
else
{
ConnectionStringSettingsconnSettings =new ConnectionStringSettings(name,connectionString, providerName);
connSection.ConnectionStrings.Add(connSettings);
m_Config.Save();
}
ConfigurationManager.RefreshSection("appSettings");
}
///
///
///
///
public static boolRemoveAppSetting(string key)
{
try
{
if(m_Config.AppSettings.Settings[key] !=null)
{
m_Config.AppSettings.Settings.Remove(key);
//m_Config.Save(ConfigurationSaveMode.Modified);
}
m_Config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
returntrue;
}
catch
{
returnfalse;
}
}
///
///
///
///
public static boolRemoveConnString(string name)
{
try
{
if(m_Config.ConnectionStrings.ConnectionStrings[name] !=null)
{
m_Config.ConnectionStrings.ConnectionStrings.Remove(name);
//m_Config.Save(ConfigurationSaveMode.Modified);
}
m_Config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("connectionStrings");
returntrue;
}
catch
{
returnfalse;
}
}
}
}