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 }

最新文章

  1. Solr DIH JDBC 源码解析
  2. percona5.7 源码安装
  3. 搭建 SubversionEdge for VS
  4. 百度地图API 关键字模糊搜索
  5. Java虚拟机详解01----初识JVM
  6. PHP常用文件函数和目录函数整理
  7. 使用Eclipse构建GeoTools项目
  8. Xcode 常用快捷键及代码自动排版 二
  9. 动态规划——最长公共子序列(LCS)
  10. form表单验证提示语句
  11. 玩转spring boot——结合阿里云持续交付
  12. NSUserDefaults的使用,保存登录状态和设置的轻量本地化存储
  13. Android方法数不能超过65535
  14. 安卓java.lang.IllegalArgumentException: The observer is null.解决方案
  15. 八、Join 连接查询
  16. MySQL 8 新特性之降序索引
  17. Python之简单验证码实现
  18. web网站使用qq第三方登录
  19. asp.net上传文件夹
  20. Bootstrap源码分析系列之核心CSS

热门文章

  1. Silverlight编程模型
  2. UVALive6571 It Can Be Arranged(最小路径覆盖)
  3. POJ 2136
  4. HDU 2159 FATE (二维完全背包
  5. Android中两种设置全屏的方法
  6. root 授权
  7. ExtJS之Ext.getDom
  8. &lt;Win32_1&gt;深入浅出windows消息机制[转自crocodile_]
  9. lintcode:逆序对
  10. xml bug之cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration...