读写INI辅助类
using System.Text;
using System.Runtime.InteropServices;
using System; namespace Benson.INI读写
{
#region INI结构介绍
/**
INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下:
[Section1]
key 1 = value2
key 1 = value2
……
[Section2]
key 1 = value1
key 2 = value2
…… 文件由若干个段落(section)组成,每个段落又分成若干个键(key)和值(value)。
*/
#endregion #region INI读写辅助类,采用WIN32API
#region WIN32API介绍
/*
Windows系统自带的Win32的API函数GetPrivateProfileString()和WritePrivateProfileString()分别实现了对INI文件的读写操作,他们位于kernel32.dll下。
但是令人遗憾的是C#所使用的.NET框架下的公共类库并没有提供直接操作INI文件的类,所以唯一比较理想的方法就是调用API函数。
然后,.Net框架下的类库是基于托管代码的,而API函数是基于非托管代码的,(在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。)如何实现托管代码与非托管代码之间的操作呢?.Net框架的System.Runtime.InteropServices命名空间下提供各种各样支持COM interop及平台调用服务的成员,其中最重要的属性之一DllImportAttribute可以用来定义用于访问非托管API的平台调用方法,它提供了对从非托管DLL导出的函数进行调用所必需的信息。下面就来看一下如何实现C#与API函数的互操作。
读操作:
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath);
section:要读取的段落名
key: 要读取的键
defVal: 读取异常的情况下的缺省值
retVal: key所对应的值,如果该key不存在则返回空值
size: 值允许的大小
filePath: INI文件的完整路径和文件名写操作: 写操作
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
section: 要写入的段落名
key: 要写入的键,如果该key存在则覆盖写入
val: key所对应的值
filePath: INI文件的完整路径和文件名
*/
#endregion public class INIManager
{
public string iniPath; //INI文件路径以及名称 #region DLL导入
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
#endregion #region 构造函数
/// <summary>
/// 构造方法
/// </summary>
/// <param name="INIPath">文件路径</param>
public INIManager(string INIPath)
{
iniPath = INIPath;
} /// <summary>
/// 在不提供文件时候的构造方法
/// </summary>
public INIManager() //如果不提供INI文件的路径以及名称,则默认为当前的应用名称.ini
{
char[] charsToTrim = { '\"',' '};
string fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(Environment.CommandLine.Trim(charsToTrim));
iniPath = Environment.CurrentDirectory+ "\\" +fileNameWithoutExtension + ".ini";
//Console.WriteLine(iniPath); //Test Example
}
#endregion #region INI写入
/// <summary>
/// 写入INI文件,如果键,值存在则直接覆盖
/// </summary>
/// <param name="section">段落名称(如"SectionName"(无需双引号))</param>
/// <param name="key">键</param>
/// <param name="value">值</param>
public void IniWriteValue(string section, string key, string value)
{
WritePrivateProfileString(section, key, value, this.iniPath);
} /// <summary>
/// 写入INI文件,默认Default段落
/// </summary>
/// <param name="Key">键</param>
/// <param name="Value">值</param>
public void IniWriteValue( string Key, string Value)
{
string Section = @"Default";
IniWriteValue(Section, Key, Value);
}
#endregion #region INI读取
/// <summary>
/// 读出INI文件
/// </summary>
/// <param name="section">段落名称(如"SectionName"(无需双引号) )</param>
/// <param name="Key">键</param>
/// <returns>返回对应键的值</returns>
public string IniReadValue(string section, string Key)
{
StringBuilder temp = new StringBuilder();
int i = GetPrivateProfileString(section, Key, "", temp, , this.iniPath);
return temp.ToString();
} /// <summary>
/// 读出INI文件,默认情况下从Default中读取
/// </summary>
/// <param name="Key">键</param>
/// <returns>返回对应键的值</returns>
public string IniReadValue(string Key)
{
string section = @"Default";
return IniReadValue(section, Key);
} }
#endregion #endregion #region 测试用类
class Test
{
static void Main(string[] args)
{
INIManager imDriveC = new INIManager(@"c:\test.ini");
Console.WriteLine(imDriveC.IniReadValue("name1").Equals("").ToString()); //首先查看在文件不存在的情况下的是否有异常,异常读取到的值
imDriveC.IniWriteValue("name1", "carl");
Console.WriteLine(imDriveC.IniReadValue("Name1")); INIManager im = new INIManager();
im.IniWriteValue("姓","Cai");
im.IniWriteValue("名", "Benson"); Console.WriteLine(im.IniReadValue("姓"));
Console.WriteLine(im.IniReadValue("cao"));
Console.ReadKey();
}
}
#endregion }
读写INI辅助类的更多相关文章
- c# 利用动态库DllImport("kernel32")读写ini文件(提供Dmo下载)
c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...
- QT读写ini配置文件
/********下面是写ini文件*************************/ //Qt中使用QSettings类读写ini文件 //QSettings构造函数的第一 ...
- VB读写INI文件的四个函数以及相关API详细说明
WritePrivateProfileString函数说明 来源:http://blog.csdn.net/wjb9921/article/details/2005000 在我们写的程序当中,总有一 ...
- C# 读写INI 文件
INI 格式: [Section1] KeyWord1 = Value1 KeyWord2 = Value2 ... [Section2] KeyWord3 = Value3 KeyWord4 = V ...
- WIN32读写INI文件方法
在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置.大小.一些用户设置的 数据等等,在 Dos 下编程的时候,我们一般自己产生一个 ...
- 读写ini文件
C# 使用文件流来读写ini文件 背景 之前采用ini文件作为程序的配置文件,觉得这种结构简单明了,配置起来也挺方便.然后操作方式是通过WindowsAPI,然后再网上找到一个基于WindowsAPI ...
- 在 WinCe 平台读写 ini 文件
在上篇文章开发 windows mobile 上的今日插件时,我发现 wince 平台上不支持例如 GetPrivateProfileString 等相关 API 函数.在网络上我并没有找到令我满意的 ...
- 使用C#读写ini配置文件
INI就是扩展名为"INI"的文件,其实他本身是个文本文件,可以用记事本打工,主要存放的是用户所做的选择或系统的各种参数. INI文件其实并不是普通的文本文件.它有自己的结构.由若 ...
- Windows中读写ini文件
.ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,来配置应用软件以实现不同用户的要求.配置文件有很多种如ini配置文件,XML ...
随机推荐
- 如何在帝国cms后台菜单栏中添加删除链接?
下午测试一个网上下载经过二次开发的帝国cms系统,还原完数据进入后台ytkah发现菜单栏多出了几个链接,有点不习惯,就想着怎么把它去掉.由于自己用的win7系统,搜索时没有像xp那样可以搜索包含某字符 ...
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...
- 7 天玩转 ASP.NET MVC — 第 6 天
目录 第 1 天 第 2 天 第 3 天 第 4 天 第 5 天 第 6 天 第 7 天 0. 前言 欢迎来到第六天的 MVC 系列学习中.希望你在阅读此篇文章的时候,已经学习了前五天的内容,这也是第 ...
- Javascript获取URL参数值
getQueryString: function (name) { var reg = new RegExp("(^|&)" + name.toLowerCase() + ...
- call by reference and copy/restore
转自:http://stackoverflow.com/questions/8848402/whats-the-difference-between-call-by-reference-and-cop ...
- POJ 1661 Help Jimmy (dijkstra,最短路)
刚在百度搜索了一下这道题的题解, 因为看到有别人用动态规划做的,所以想参考一下. 结果顺带发现了有那么几个网站,上面的文章竟然和我这篇一模一样(除了一些明显的错别字外),我去,作者还是同一个人Admi ...
- POJ 2081
#include <iostream> #define MAXN 500005 using namespace std; //unsigned _m[MAXN]; ]; int main( ...
- 强大的grep命令
1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全 ...
- .NET Framework 框架简述01
NET技术可以以规范和实现两部分来划分. 规范: 公共语言架构(Common Language Infrastructure, CLI),主要包括 1.通用类型系统(Common Type S ...
- 如何向AcmeAir注入问题代码
为什么要注入问题代码? AcmeAir的常规代码是为了压测测试准备的,所以绝大部分的操作都是可以在几十毫秒中就可以正常返回的.为了向用户展示我们APM工具可以在源代码级别发现系统潜在问题,我们需要在A ...