INI文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,TSVN的配置文件就是使用INI存储的,下面我们介绍下使用C#读写INI文件的整体思路。
首先,读写INI文件需要用到WindowsAPI中的WritePrivateProfileString与GetPrivateProfileString方法,然而怎么在C#中调用这两个方法呢?
C#提供了DllImportAttribute属性,可将该属性应用于方法,该属性提供对从非托管 DLL 导出的函数进行调用所必需的信息。作为最低要求,必须提供包含入口点的 DLL 的名称。
在此,我们需要调用包含上文提到的两个读写INI文件方法的DLL(kernel32),语法如下:[DllImport("kernel32")]。
然后根据API需要的参数对两个方法进行封装。我们将其封装在IniAccessor类中,封装完毕的方法为:
[DllImport("kernel32")]
internal static extern long WritePrivateProfileString(string section, string key, string value, string filePath);
参数说明:
参数名称
|
数据类型
|
说明
|
返回值
|
long
|
非零表示写入成功,等于零表示写入失败
|
section
|
String
|
要在其中写入新字串的小节名称。这个字串不区分大小写
|
key
|
String
|
要设置的项名或条目名。这个字串不区分大小写。用null可删除这个配置节的所有设置项
|
value
|
String
|
指定为这个项写入的字串值。用Null表示删除这个项现有的字串
|
filePath
|
String
|
指定INI文件的路径(包括文件名);如果没有指定完整路径名,则windows会在windows目录查找文件。如果文件没有找到,则函数会创建它
|
[DllImport("kernel32")]
internal static extern long GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder refValue, int size, string filePath);
参数说明:
参数名称
|
数据类型
|
说明
|
返回值
|
long
|
复制到lpReturnedString缓冲区的字节数量,其中不包括那些NULL中止字符。如lpReturnedString缓冲区不够大,不能容下全部信息,就返回nSize-1(若lpApplicationName或lpKeyName为NULL,则返回nSize-2)
|
section
|
String
|
欲在其中查找条目的配置节名称。这个字串不区分大小写。如设为null,就在lpReturnedString缓冲区内装载这个ini文件所有配置节的列表
|
key
|
String
|
欲获取的项名或条目名。这个字串不区分大小写。如设为null,就在lpReturnedString缓冲区内装载指定配置节所有项的列表
|
defaultValue
|
String
|
指定的条目没有找到时,refValue的默认值,可设为空
|
refValue
|
String
|
指定一个字串缓冲区,存储获取到的指定条目的值,长度至少为size
|
size
|
int
|
指定装载到lpReturnedString缓冲区的最大字符数量
|
filePath
|
String
|
指定INI文件的路径(包括文件名);如果没有指定完整路径名,则windows会在windows目录查找文件
|
注意:用 DllImport 属性修饰的方法必须具有 extern 修饰符。
public bool IniWriteValue(string section, string key, string value)
{
if (IniAccessor.WritePrivateProfileString(section, key, value, _path) != 0)
return true;
else
return false;
}
public string IniReadValue(string section, string key)
{
StringBuilder value = new StringBuilder(255);
IniAccessor.GetPrivateProfileString(section, key, null, value, 255, _path);
return value.ToString();
}
下面的代码是在config文件中的miscellany配置节下,添加enable-auto-props=yes属性。
private static void EnableAutoProps()
{
string filePath = @"C:\config";
string section = "miscellany";
string key = "enable-auto-props";
IniFile iniFile = new IniFile(filePath);
iniFile.IniWriteValue(section, key, "yes");
}
其中IniFile类内封装了读取及写入方法,且在初始化时,已将INI文件路径传入,以便后续的读写操作。