INI文件是Windows平台上的一种较常用的软件配置文件格式,Windows应用程序常常使用它来保存一些配置信息。它一般是由数个包含key-value对的Section组成,每个key-value对保存着一些软件配置信息。例如最典型的NT系列的启动配置文件boot.ini:
  
  [boot loader]
  timeout=30
  default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
  [operating systems]
  multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect
  multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect
  
  在这个文件中,方括号中的字符串是Section的名字,两个方括号之间的内容为一个Section。Section的内容是一些key-value对,每个key-value对占据一行,例如timeout=30就是一对key-value对,timeout是key,对应的value是30。Windows平台专门提供了一组API可以方便地操作INI文件,例如GetPrivateProfileSection()、GetPrivateProfileInt()等。
  随着Windows系列操作系统的不断发展,INI文件的作用逐渐被注册表、XML格式的config文件等所取代,很少再用于系统配置,但我们仍可以在应用程序中使用它。在.NET平台上推荐使用的软件配置文件格式是基于XML的config文件,因此在.NET Framework中并没有提供对INI文件读写的特殊支持,使得我们有时在需要读写INI文件时不是很方便。本文将探讨如何使INI文件的读写在.NET平台上变得更加容易。当然,我们可以直接引入上述的API,但本文将不使用API,而是完全基于.NET Framework。
  创建INI文件读写类
  要在.NET平台上处理INI文件,很自然的想法就是创建一个专门的class来负责INI文件的读写工作,这个class暴露适当的接口供外部调用。一般的INI文件的尺寸很小,因此最简单的做法就是以文本的方式将整个文件读入一个string变量中。类定义如下:
  
   public class FileIni
   {
   private string fileContents = null;
   public FileIni(string fileName)
   {
   if(File.Exists(fileName))
   {
   StreamReader r = File.OpenText(fileName);
   fileContents = r.ReadToEnd();
   r.Close();
   }
   }
   }
  
  接下来我们要提供一些方法来操作这个字符串,比如从中返回所有的Section Name、取得特定的key所对应的value等。我们可以使用字符串查找之类的方法来完成这些工作,但是.NET Framework为我们提供了更好的方法,那就是正则表达式。
  正则表达式
  所谓正则表达式是一种被设计用来优化字符串操作的语言。它使用一组元字符(Metacharacters)来实现强劲的字符串操作能力。这组元字符最早来自于对DOS文件系统中?和*的扩展。在DOS文件系统中,?和*分别被用来代替单个字符和字符群组,它们可以被认为是最早的元字符。正则表达式在它们的基础上不断扩充,形成了一套元字符集,能够表达非常复杂的字符串。
  举例来说,网上注册时常常需要用户输入一个有效的Email地址。当用户输入一个字符串后,我们如何验证这个Email地址是否合法呢?使用下面这个正则表达式可以轻易地实现目的:
  
  @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
  
  关于这个正则比表达式的含义,在此不做过多解释,有兴趣的朋友可以参考相关的正则表达式资料。这个正则表达式虽不能保证用户输入的Email地址100%的真实有效,但至少可以保证用户输入的Email地址看上去是合法有效的。
  .NET Framework中提供了一些使用正则表达式的类,这些类位于System.Text.RegularExpressions名字空间下。
  使用正则表达式实现FileIni类的功能
  现在我们可以使用正则表达式来实现FileIni类的相应功能了。为了返回INI文件中所有Section的名字,我们可以使用一个只读属性SectionNames来返回一个Section Name的字符串数组。
  
   public string[] SectionNames
   {
   get
   {
   // Using regular expression to get all section names.
   string regexPattern = @"\[(?<SectionName>\w*)\]";
   Regex r = new Regex(regexPattern); // Match "[anywords]"
   MatchCollection matches = r.Matches(fileContents);
   // Writing all section names to a string array.
   string[] results = new string[matches.Count];
   for(int i = 0; i < matches.Count; i++)
   {
   results[i] = matches[i].Result("${SectionName}");
   }
   return results;
   }
   }
  
  在上面的代码中,我们使用一个正则表达式:@"\[(?<SectionName>\w*)\]",对源字符串进行一次匹配就取出了所有的Section Name。
  为了取得特定Section下的特定的key的value,我们先要取得此Section下的所有内容,然后再从中取出特定key的value。
  
   public string GetSectionString(string sectionName)
   {
   string regexPattern = @"(\[" + sectionName + @"\]"
   + @"(?<SectionString>.*)\[)";
   Regex r = new Regex(regexPattern, RegexOptions.Singleline);
   if(r.IsMatch(fileContents))
   {
   return r.Match(fileContents).Result("${SectionString}");
   }
   return string.Empty;
   }
  
  GetSectionString()根据特定的sectionName取得此Section的全部内容。假设sectionName为字符串boot loader,此时的正则表达式为@”(\[boot loader\](?<SetionString>.*)\[]”。得到Section下的所有内容后,我们再从其中得到我们想要的value值。
  
   public string GetKeyString(string sectionName, string keyName)
   {
   string sectionString = this.GetSectionString(sectionName);
   string regexPattern = @"(" + keyName + @"=(?<value>.*)\r\n)";
   Regex r = new Regex(regexPattern);
   if(r.IsMatch(fileContents))
   {
   return r.Match(fileContents).Result("${value}");
   }
  
   return string.Empty;
   }
  
  在此基础上,可以得到更多的诸如GetKeyInt()之类的方法。至于写方法,利用Regex的Replace()方法也是很容易实现的,在此就不做过多的叙述了。
  总结
  本文着重演示了正则表达式在读写INI文件时的应用。所实现的INI文件读写类FileIni扩展性稍显不足,例如,这个类只能处理通用格式的INI文件,对于格式稍有变化的INI文件,此类中的正则表达式就需要修改了。总之,正则表达式是处理字符串的强大工具,掌握了它
  对我们更高效地处理字符串是绝对有好处的。

转载于:https://www.cnblogs.com/MaxWoods/archive/2010/09/04/1818125.html

在.NET中读写INI文件 ——兼谈正则表达式的应用相关推荐

  1. VC中读写ini文件

    我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下: 一.将信息写入.INI文件中. 1.所用的WINAP ...

  2. C#中读写INI文件

    INI文件就是扩展名为"ini"的文件.在Windows系统中,INI文件是很多,最重要的就是"System.ini"."System32.ini&q ...

  3. C#学习笔记——读写ini文件

    1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: ...

  4. VC中操作INI文件的API

    VC中操作INI文件的API (1)操作系统配置文件Win.ini的函数: 函数名 功能 GetProfileSection 读取win.ini中指定节lpAppName中所有键名及其值.lpRetu ...

  5. Visual basic 6读写ini文件

    ini文件是windows的系统配置文件, 被用来对操作系统或特定程序初始化或进行参数设置. 在Windows系统中,INI文件是很多,最重要的就是"System.ini".&qu ...

  6. C#关于读写INI文件

    C#关于读写INI文件 什么是ini文件就是一个配置文件,一般把数据库等配置信息放进去,然而,改变数据库的密码,数据库名称,ip等,不要改源码重新编译,只需要用记事本打开set.ini 文件,修改保存 ...

  7. C# 读写Ini文件

    ini文件在Win95以前比较盛行,之后由于出册表等技术的出现,ini技术主键退居二线,不过对于一些小项目,读写ini文件还是很适用的. Windows API提供了读写配置文件的操作,在C#程序中只 ...

  8. 在 WinCe 平台读写 ini 文件

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

  9. QT中读写.ini配置文件的操作

    ini 文件(即Initialization file):这种类型的文件中通常存放的是一个程序的初始化信息.ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个K ...

最新文章

  1. Oracle 9i 升级至Oracle10g数据库最好的方法
  2. python【力扣LeetCode算法题库】1103- 分糖果 II
  3. oracle connect by用法
  4. sqlserver concat 字符串位数不够左侧补0_一文搞懂Python字符串格式化
  5. yum安装apache及问题解决
  6. Quartz框架中的Listener
  7. 美国高校开源迄今为止最大新冠肺炎CT数据集
  8. Leetcode每日一题:973.k-closest-points-to-origin(最接近原点的K个点)
  9. pcb文件转成原理图_初学PCB设计,到底该学习哪款软件?
  10. jquery 点击显示更多
  11. Itext7 jar 下载 链接
  12. 地理探测器——空间统计分析
  13. 神经网络可以用来预测吗,神经网络预测的优点
  14. 电子邮件传输协议原理简介
  15. 【c++ primer5】重点知识总结
  16. word怎样在方框内打勾/打叉 word方框打勾教程
  17. 后端利用MultipartFIle类型参数接受文件上传
  18. 《绮梦朦胧,一眼浮生醉流年》
  19. Delphi隐藏/显示Windows桌面上的图标
  20. UEFI开发探索98 – 硬盘访问Diskdump

热门文章

  1. python程序设计试题库_最新《Python程序设计》试题库资料
  2. ug快捷键命令大全_UG命令大全及快捷键的用法用处说明
  3. parallels网络初始化失败_出神入化:特斯拉AI主管、李飞飞高徒Karpathy的33个神经网络炼丹技巧...
  4. windows安装python2.7_Windows下安装python2.7及科学计算套装
  5. 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is
  6. python字典遍历 没有顺序_Python实现字典的遍历与排序功能示例
  7. JS判断相等或者不等于(==、===、!=、!==)运算符
  8. 传感器工作原理_荧光氧气传感器工作原理简介
  9. rpc wmi 服务不可用_在Windows上修复“RPC服务器不可用”的方法
  10. 面向串口编程java_Java串口编程例子