在c#应用程序中,常将ini文件作为配置文件,用于存储应用程序的设置和参数。
一、ini文件结构
ini文件结构简单,由节(sections)和键值对(key-value pairs)组成。每个节由方括号包围,例如[sectionname],而键值对则是以等号=分隔的字符串,例如key=value。每个节都包含一个或多个键值对,用于存储相关的配置信息。
ini文件示例:
[amplifierform] resinitialize=0.5,0.7,0.5,0.6,0.6 [offsignalform] resinitialize=0.5,0.7,0.5,0.6,0.6 rescoll=1.3,1.5
该示例中有两个节:amplifierform、offsignalform,每个节下都有一些键值对,用于存储配置信息。
二、读取ini文件中的数据
c#命名空间中没有直接读写ini的类,但在"kernel32.dll"文件中有win32的api函数–writeprivateprofilestring()和getprivateprofilestring(),可操作ini文件。
静态操作使用类
using system;
using system.collections.generic;
using system.io;
using system.linq;
using system.runtime.interopservices;
using system.text;
using system.threading.tasks;
namespace fileoperationsdemo
{
public class readwriteini
{
#region api函数声明
/// <summary>
/// 写入ini文件
/// </summary>
/// <param name="section">节点名称</param>
/// <param name="key">键</param>
/// <param name="val">值</param>
/// <param name="filepath">ini路径</param>
/// <returns>0失败/其他成功</returns>
[dllimport("kernel32")]
private static extern long writeprivateprofilestring(string section, string key, string val, string filepath);
/// <summary>
///
/// </summary>
/// <param name="section">节点名称,[]内的段落名</param>
/// <param name="key">键</param>
/// <param name="def">值(未读取到数据时设置的默认返回值)</param>
/// 对应api函数的def参数,它的值由用户指定,是当在配置文件中没有找到具体的value时,就用def的值来代替。可以为空
/// <param name="retval">读取到的结果值</param>
/// <param name="size">读取缓冲区大小</param>
/// <param name="filepath">ini配置文件的路径加ini文件名</param>
/// <returns>读取到的字节数量</returns>
[dllimport("kernel32")]
private static extern int getprivateprofilestring(string section, string key, string def, stringbuilder retval, int size, string filepath);
#endregion
/// <summary>
/// 写ini,添加新节点、键值,及编辑修改键对应的值
/// </summary>
/// <param name="in_filename">ini配置文件的路径加ini文件名</param>
/// <param name="section">节点名称,[]内的段落名</param>
/// <param name="key">键</param>
/// <param name="value">值</param>
public static bool inifile_setval(string in_filename, string section, string key, string value)
{
if (file.exists(in_filename))
{
// 调用winapi函数将key=value写入section节点下
long len = writeprivateprofilestring(section, key, value, in_filename);
if (len == 0)
{
return false;
}
else
{
return true;
}
}
else
{
return true;
}
}
/// <summary>
/// 读ini
/// </summary>
/// <param name="in_filename">ini配置文件的路径加ini文件名</param>
/// <param name="section">节点名称,[]内的段落名</param>
/// <param name="key">键</param>
/// <returns></returns>
public static string inifile_getval(string in_filename, string section, string key)
{
if (file.exists(in_filename))
{
// 声明接收的数据
stringbuilder builder = new stringbuilder(1024);
// 调用winapi函数读取section节点下key的值
int len = getprivateprofilestring(section, key, "", builder, 1024, in_filename);
if (len == 0)
return "1";
else
return (builder.tostring());
}
else
return string.empty;
}
}
}
操作示例
/// <summary>
/// 读取ini文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_click(object sender, eventargs e)
{
string pathname = application.startuppath + "\\config\\resoriginal.ini";
string resstarter = readwriteini.inifile_getval(pathname, "selfcheckface", "resinitialize");
string[] resinitline = resstarter.split(',');
for (int ii = 0; ii < resinitline.length; ii++)
{
richtextbox2.appendtext(resinitline[ii] + "\n");
}
}
/// <summary>
/// 写入ini文件,新建或编辑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_click(object sender, eventargs e)
{
string pathname = application.startuppath + "\\config\\resoriginal.ini";
readwriteini.inifile_setval(pathname, "selfcheckface", "resinitialize", "1,2,3,4,5");
string[] resinitline = richtextbox2.lines;
string tempwrite = string.join(",", resinitline);
tempwrite=tempwrite.remove(tempwrite.length-1);
readwriteini.inifile_setval(pathname, "selfcheckf", "resinitialize", tempwrite);
}

到此这篇关于c# 读写ini文件操作实现的文章就介绍到这了,更多相关c# 读写ini内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论