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辅助类的更多相关文章

  1. c# 利用动态库DllImport("kernel32")读写ini文件(提供Dmo下载)

    c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...

  2. QT读写ini配置文件

        /********下面是写ini文件*************************/     //Qt中使用QSettings类读写ini文件     //QSettings构造函数的第一 ...

  3. VB读写INI文件的四个函数以及相关API详细说明

    WritePrivateProfileString函数说明  来源:http://blog.csdn.net/wjb9921/article/details/2005000 在我们写的程序当中,总有一 ...

  4. C# 读写INI 文件

    INI 格式: [Section1] KeyWord1 = Value1 KeyWord2 = Value2 ... [Section2] KeyWord3 = Value3 KeyWord4 = V ...

  5. WIN32读写INI文件方法

      在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置.大小.一些用户设置的 数据等等,在 Dos 下编程的时候,我们一般自己产生一个 ...

  6. 读写ini文件

    C# 使用文件流来读写ini文件 背景 之前采用ini文件作为程序的配置文件,觉得这种结构简单明了,配置起来也挺方便.然后操作方式是通过WindowsAPI,然后再网上找到一个基于WindowsAPI ...

  7. 在 WinCe 平台读写 ini 文件

    在上篇文章开发 windows mobile 上的今日插件时,我发现 wince 平台上不支持例如 GetPrivateProfileString 等相关 API 函数.在网络上我并没有找到令我满意的 ...

  8. 使用C#读写ini配置文件

    INI就是扩展名为"INI"的文件,其实他本身是个文本文件,可以用记事本打工,主要存放的是用户所做的选择或系统的各种参数. INI文件其实并不是普通的文本文件.它有自己的结构.由若 ...

  9. Windows中读写ini文件

    .ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,来配置应用软件以实现不同用户的要求.配置文件有很多种如ini配置文件,XML ...

随机推荐

  1. 利用PE数据目录的导入表获取函数名及其地址

    PE文件是以64字节的DOS文件头开始的(IMAGE_DOS_HEADER),接着是一段小DOS程序,然后是248字节的 NT文件头(IMAGE_NT_HEADERS),NT的文件头位置由IMAGE_ ...

  2. .NET设计模式(19):观察者模式(Observer Pattern)(转)

    概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御 ...

  3. python开发中常用的框架

    以下是15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架 Django 应该是最出名的 ...

  4. web访问速度优化分析

    请求从发出到接收完成一共经历了DNS Lookup.Connecting.Blocking.Sending.Waiting和Receiving六个阶段,时间共计38ms.请求完成之后是DOM加载和页面 ...

  5. Xamarin for Visual Studio 破解日志

    一.相关声明 本文涉及的 Xamarin 系列软件的版权为 Xamarin Inc. 所有 以本文涉及的思路和方法破解的软件,禁止用于商业用途 如无必要,学习和研究时最好以正版为准 团队或土豪等若觉得 ...

  6. 一、Android NDK编程预备之Java jni简介

    转自:  http://www.eoeandroid.com/thread-264384-1-1.html 游戏开发 视频教程 博客 淘帖     论坛›eoe·Android应用开发区›Androi ...

  7. C Primer Plus之结构和其他数据形式

    声明和初始化结构指针 声明结构化指针,例如: struct guy * him; 初始化结构指针(如果barney是一个guy类型的结构),例如: him = &barney; 注意:和数组不 ...

  8. MongoDB (二) MongoDB 优点

    任何关系型数据库,具有典型的架构设计,显示表和这些表之间的关系.虽然在 MongoDB中,没有什么关系的概念. MongoDB比RDBMS的优势 架构:MongoDB是文档型数据库,其中一个集合保存不 ...

  9. C#文件输入输出流

    从输入流中读取数据(行读取字符串) using System; using System.Collections.Generic; using System.Linq; using System.Te ...

  10. Linux下Boost交叉编译

    http://davidlwq.iteye.com/blog/1580752 运行环境:ubuntu 12.04, boost 1.50.0 由于要把boost移植到arm板上去,所以折腾了一下,后来 ...