在写这篇文章之前搜索过网上关于ini读写的博文,但是读取Section下所有key的方法很难找到,(最后还是被我找到了^_^)。下面先来说下ini:(**我是cp的**)
**在作应用系统开发时,管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等。由于Xml的兴起,现在的配置文件大都是以xml文档来存储。比如Visual Studio.Net自身的配置文件Mashine.config,Asp.Net的配置文件Web.Config,包括我在介绍Remoting中提到的配置文件,都是xml的格式。
传统的配置文件ini已有被xml文件逐步代替的趋势,但对于简单的配置,ini文件还是有用武之地的。ini文件其实就是一个文本文件,它有固定的格式,节Section的名字用[]括起来,然后换行说明key的值:
[section]
key=value
如数据库服务器配置文件:
DBServer.ini
[Server]
Name=localhost
[DB]
Name=NorthWind
[User]
Name=sa**
在 c#中只有通过win api才能操作ini,所以我们要看api是怎么写的:
(1) BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);
其中各参数的意义:
LPCTSTR lpAppName 是INI文件中的一个字段名.
LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.
LPCTSTR lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.
LPCTSTR lpFileName 是完整的INI文件名.
(2) DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);
其中各参数的意义:
前二个参数与 WritePrivateProfileString中的意义一样.
lpDefault : 如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量.
lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.
nSize : 目的缓存器的大小.
lpFileName : 是完整的INI文件名.
网上所有的版本的api参数大部分都是一致的,除了GetPrivateProfileString的第4个参数LPTSTR lpReturnedString,接收INI文件中的值的CString对象,即目的缓存器,既然是缓存器,那就可能是数组,也可能是stringbuilder.所以我们有2种选择。
当我们选择第一种的时候,就可以把Section的所有key取进lpReturnedString里面。
当我们选择第一种的时候,就只能把Section的第一个key取进lpReturnedString里面。
我觉得大家都理解了,看代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
namespace iniReadAndWrite
{
class Program
{
#region API函数声明
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key,
string val, string filePath);
[DllImport("kernel32")]
//[难点1]第4个参数也可以写成StringBuilder retVal;设置成byte[]就可以支持难点2
private static extern long GetPrivateProfileString(string section, string key,
string def, byte[] retVal, int size, string filePath);
#endregion
#region 读Ini文件
//[难点2]key为空时就可以取得Section下所有的key.
public static string ReadIniData(string Section, string Key, string NoText, string iniFilePath)
{
if (File.Exists(iniFilePath))
{
byte[] temp = new byte[65535];
long buflen = GetPrivateProfileString(Section, Key, NoText, temp, temp.GetUpperBound(0), iniFilePath);
string s = Encoding.GetEncoding(0).GetString(temp);
s = s.Substring(0, (int)buflen);
return s.Trim();
//下面的第4个参数是StringBuilder
//StringBuilder temp = new StringBuilder(1024);
//GetPrivateProfileString(Section, Key, NoText, temp, 1024, iniFilePath);
//return temp.ToString();
}
else
{
return String.Empty;
}
}
#endregion
#region 写Ini文件
public static bool WriteIniData(string Section, string Key, string Value, string iniFilePath)
{
if (File.Exists(iniFilePath))
{
long OpStation = WritePrivateProfileString(Section, Key, Value, iniFilePath);
if (OpStation == 0)
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
#endregion
static void Main(string[] args)
{
WriteIniData("Staus", "vbts5", "Running", @"c://t.ini");
WriteIniData("Staus", "vbts4", "Running", @"c://t.ini");
WriteIniData("Staus", "vbts5", "NotRunning", @"c://t.ini");
Console.WriteLine(ReadIniData("Staus", "vbts5", "", @"c://t.ini"));
Console.WriteLine(ReadIniData("Staus", null, null, @"c://t.ini"));
}
}
}
BTW:可以跟我留言指出我的错误。谢谢。