INI文件常用于保存各类设置或本地化文本,大概格式如下:

[Section]
key=value

然而.NET框架似乎并没有提供一个实用的工具来操作它,或许是因为MS想让我们都使用Settings类控制的config文件?
但是出于多种原因,我还是不太喜欢用Settings类以及这个XML格式的config文件。

幸运的是,有两个Win32API可以帮我们完成INI文件的控制:
WritePrivateProfileString
GetPrivateProfileString

但是非常尴尬的是这俩一个能写入中文,另一个却读不好中文。。。

于是只好自己动手丰衣足食了,谨记于此以备日后又有所需:

 abstract class ConfigurationBase
{
public abstract string Path { get; } public abstract string Section { get; } /// <summary>
/// 指定好编码格式就能支持各种语言文字了
/// </summary>
private readonly Encoding encoding = Encoding.UTF8; public void Clear()
{
File.Delete(Path);
} public void Save()
{
File.WriteAllLines(Path, lines.ToArray(), encoding);
} private readonly List<string> lines; protected ConfigurationBase()
{
if (File.Exists(Path))
{
lines = new List<string>(
File.ReadAllLines(Path, encoding));
}
else
{
lines = new List<string>();
}
} protected string Get(string key, string defaultVal)
{
if (lines.Count != )
{
string sectionLine = String.Format("[{0}]", Section);
string keyLine = String.Format("{0}=", key);
Regex otherSection = new Regex(@"^\[[^\]+]\]$", RegexOptions.Compiled); bool inSection = false;
foreach (string line in lines)
{
if (sectionLine == line)
{
inSection = true;
}
else if (otherSection.IsMatch(line))
{
if (inSection) break;
}
else if (inSection && line.StartsWith(keyLine))
{
return line.Substring(keyLine.Length);
}
}
}
return defaultVal;
} protected void Set(string key, string value)
{
string sectionLine = String.Format("[{0}]", Section);
string keyLine = String.Format("{0}=", key);
Regex otherSection = new Regex(@"^\[[^\]+]\]$", RegexOptions.Compiled);
string valueLine = String.Format("{0}{1}", keyLine, value); bool inSection = false;
for (int i = ; i < lines.Count; i++)
{
if (sectionLine == lines[i])
{
inSection = true;
}
else if (otherSection.IsMatch(lines[i]))
{
if (inSection)
{
lines.Insert(i, valueLine);
break;
}
}
else if (inSection && lines[i].StartsWith(keyLine))
{
lines[i] = valueLine;
}
}
if (inSection)
{
lines.Add(valueLine);
}
else
{
lines.Add(sectionLine);
lines.Add(valueLine);
}
}
}

[C#]INI文件控制类的更多相关文章

  1. android操作ini工具类

    package com.smarteye.common; import java.io.BufferedReader; import java.io.BufferedWriter; import ja ...

  2. C# 配置文件ini操作类

    // [ DllImport ( "kernel32" ) ] //private static extern long WritePrivateProfileString ( s ...

  3. 我也分享一个c# ini操作类

    刚刚看了一篇 @云菲菲 的关于基于正则的INI辅助类文章:http://www.cnblogs.com/yunfeifei/p/4081977.html,作者写的不错.还看到评论处有一个的地址:htt ...

  4. C# 读取Ini配置文件类

    配置文件 为fileName.ini 的文件 第一行必须为空,不然读不出值 [section1] key=value key2=value ......... [section2] key=value ...

  5. c#读取INI文件类

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;na ...

  6. 自己写的 读写 ini 配置文件类

    /// <summary> /// 不调用系统API 读写 ini 配置文件 /// </summary> public class RW_ini { #region ==== ...

  7. Ini操作类

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  8. C# INI配置文件读写类

    ini是一种很古老的配置文件,C#操作ini文件借助windows底层ini操作函数,使用起来很方便: public class IniHelper { [DllImport("kernel ...

  9. C# Ini配置文件

    public class INIUserAccound { static IniFile Ini = new IniFile(AppDomain.CurrentDomain.BaseDirectory ...

随机推荐

  1. Asp.Net从相对路径获取绝对路径的方法(不需要httpcontext上下文也可)

    //如果拿不到当前HttpContext上下文的话可以用该方法取得绝对路径 var filePath = HostingEnvironment.MapPath("需要获取绝对路径 的 相对路 ...

  2. 实现单台测试机6万websocket长连接

    本文由作者郑银燕授权网易云社区发布. 本文是我在测试过程中的记录,实现了单台测试机发起最大的websocket长连接数.在一台测试机上,连接到一个远程服务时的本地端口是有限的.根据TCP/IP协议,由 ...

  3. Mac OS 10.12 - 在VMwear Workstation12.5.2中大写键和中英文输入法的切换!

    大小写切换: Alt+CapsLock(不过必须在英文状态下)!! 输入法切换: CapsLock进行中英文输入法的切换

  4. python django 更改模型字段出错时的一个解决办法

    python/django 框架自带的 orm 无疑是django框架最拿得出手的一个亮点,orm无疑极大的方便了项目的开发,提高了开发的效率. 在实际的项目开发过程中,我们有时候需要修改模型的字段, ...

  5. centOS 自动锁屏 解决办法

    System-->preferences --> Screensaver中 找到 Lock screen when screensaver is active 把前面的钩去掉

  6. 【mongodb】——常用命令大全

    MongoDB是NoSQL数据库系统中比较流行的数据库之一.它也是最接近关系型数据库的,一个数据库可以包含多个集合(Collection),类似于关系数据库中的表:而每个集合中可以存储一组由列标识的记 ...

  7. 深度了解git工具

    今天给大家介绍一个深度了解git的学习视频,视频讲的挺好的,可以听听. 深度了解git学习视频

  8. 2019年北航OO第一次博客总结

    一.基于度量对程序结构的分析 1. 第一次作业 1.1 基于类的分析的度量 首先,基于类的属性个数,方法个数,每个方法的规模,每个方法的控制分支数目,类总代码规模等特征对本次作业的结构进行分析. 1. ...

  9. Scala中使用implict 扩展现有类的方法

    Scala中implict的一种用法就是扩展现有类的方法,有点类似于.Net中的扩展方法(MS对扩展方法的介绍:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改 ...

  10. ubuntu16.04上Eclipse和hadoop配置

    1.安装Eclipse 1>下载Eclipse 可以以多种方式下载Eclipse,下面介绍直接从eplise官网下载和从中国镜像站点下载,下载把eclipse上传到Hadoop环境中. 第一种方 ...