.ini 文件是Initialization File的缩写,即初始化文件。和txt文件类似,就是文本文件,只是里面内容有自己的格式。
INI文件由节(section)、键、值组成。
例如
[main]
name=cy
age=18
注解使用分号表示;。在分号后面的文字,直到该行结尾都全部为注解。
因为INI文件可能是项目中共用的,所以使用[Section Name]段名来区分不同用途的参数区。
例如:[Section1 Name]表示传感器灵敏度参数区;[Section2 Name]表示测量通道参数区等等。
下面是一个ini文件下包含2个节名的配置。
[main]
name=cy
age=18
[port]
portname=COM4
port=4
工具类INIUtil.cs:
using System;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
/**
* ini数据管理类
* */
namespace DongliCAD.utils
{
class INIUtil
{
private string iniFile = FileUtil.GetAssemblyPath() + @"/dongliData.ini";
private static string defaultSection = "main";
public static System.Text.Encoding Encoding = System.Text.Encoding.UTF8;
public INIUtil()
{
if (!File.Exists(this.iniFile))
{
File.Create(this.iniFile).Close();
}
}
public INIUtil(string file)
{
this.iniFile = file;
if (!File.Exists(file))
{
File.Create(file).Close();
}
}
///
/// 批量读取键值对
///
/// 返回INI配置结构体列表,单独结构可以通过索引获取或设置
public System.Collections.Generic.List ReadValues()
{
return ReadValues(this.iniFile);
}
public string ReadValue(string key)
{
string comments = "";
return ReadValue(this.iniFile, key, "", ref comments);
}
public string ReadValue(string key, string section)
{
string comments = "";
return ReadValue(this.iniFile, key, section, ref comments);
}
public string ReadValue(string key, string section, ref string comments)
{
if (string.IsNullOrEmpty(this.iniFile)) throw new System.Exception("没有设置文件路径");
return ReadValue(this.iniFile, key, section, ref comments);
}
public static string ReadValue(string file, string key, string section)
{
string comments = "";
return ReadValue(file, key, section, ref comments);
}
private static string GetText(string file)
{
string content = File.ReadAllText(file);
if (content.Contains("�"))
{
Encoding = System.Text.Encoding.GetEncoding("GBK");
content = File.ReadAllText(file, System.Text.Encoding.GetEncoding("GBK"));
}
return content;
}
public static string ReadValue(string file, string key, string section, ref string comments)
{
if (string.IsNullOrEmpty(section))
{
//2018-11-19
section = defaultSection;
}
string valueText = "";
string content = GetText(file);
if (!string.IsNullOrEmpty(section)) //首先遍历节点
{
MatchCollection matches = new Regex(@"\[\s*(?'section'[^\[\]\s]+)\s*\]").Matches(content);
if (matches.Count <= 0) return "";
Match currMatch = null;
Match tailMatch = null;
foreach (Match match in matches)
{
string match_section = match.Groups["section"].Value;
if (match_section.ToLower() == section.ToLower())
{
currMatch = match;
continue;
}
else if (currMatch != null)
{
tailMatch = match;
break;
}
}
valueText = content.Substring(currMatch.Index + currMatch.Length, (tailMatch != null ? tailMatch.Index : content.Length) - currMatch.Index - currMatch.Length);//截取有效值域
}
else
valueText = content;
string[] lines = valueText.Split(new string[] { "\r\n" }, System.StringSplitOptions.None);
foreach (string line in lines)
{
if (string.IsNullOrEmpty(line) || line == "\r\n" || line.Contains("["))
continue;
string valueLine = line;
if (line.Contains(";"))
{
string[] seqPairs = line.Split(';');
if (seqPairs.Length > 1)
comments = seqPairs[1].Trim();
valueLine = seqPairs[0];
}
string[] keyValuePairs = valueLine.Split('=');
string line_key = keyValuePairs[0];
string line_value = "";
if (keyValuePairs.Length > 1)
{
line_value = keyValuePairs[1];
}
if (key.ToLower().Trim() == line_key.ToLower().Trim())
{
return line_value;
}
}
return "";
}
public static System.Collections.Generic.List ReadValues(string file)
{
System.Collections.Generic.List iniStructList = new System.Collections.Generic.List();
string content = GetText(file);
System.Text.RegularExpressions.MatchCollection matches = new System.Text.RegularExpressions.Regex(@"\[\s*(?'section'[^\[\]\s]+)\s*\](?'valueContent'[^\[\]]*)").Matches(content);
foreach (System.Text.RegularExpressions.Match match in matches)
{
IniStruct iniStruct = new IniStruct();
string match_section = match.Groups["section"].Value;
string match_value = match.Groups["valueContent"].Value;
iniStruct.Section = match_section;
string[] lines = match_value.Split(new string[] { "\r\n" }, System.StringSplitOptions.None);
foreach (string line in lines)
{
if (string.IsNullOrEmpty(line) || line == "\r\n" || line.Contains("["))
continue;
string comments = "";//注释
string valueLine = line;
if (line.Contains(";"))
{
string[] seqPairs = line.Split(';');
if (seqPairs.Length > 1)
comments = seqPairs[1].Trim();
valueLine = seqPairs[0];
}
string[] keyValuePairs = valueLine.Split('=');
string line_key = keyValuePairs[0];
string line_value = "";
if (keyValuePairs.Length > 1)
{
line_value = keyValuePairs[1];
}
iniStruct.Add(line_key, line_value, comments);
}
iniStructList.Add(iniStruct);
}
return iniStructList;
}
public void Write(string key, string value)
{
Write("", key, value, null);
}
public void Write(string section, string key, string value)
{
Write(section, key, value, null);
}
public void Write(string section, string key, string value, string comment)
{
Write(this.iniFile, section, key, value, comment);
}
public static void Write(string file, string section, string key, string value, string comment)
{
if (string.IsNullOrEmpty(section))
{
//2018-11-19
section = defaultSection;
}
bool isModified = false;
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
string content = GetText(file);
System.Text.StringBuilder newValueContent = new System.Text.StringBuilder();
#region 写入了节点
if (!string.IsNullOrEmpty(section))
{
string pattern = string.Format(@"\[\s*{0}\s*\](?'valueContent'[^\[\]]*)", section);
MatchCollection matches = new Regex(pattern).Matches(content);
if (matches.Count <= 0)
{
stringBuilder.AppendLine(string.Format("[{0}]", section)); //检查节点是否存在
stringBuilder.AppendLine(string.Format("{0}={1}{2}", key, value, !string.IsNullOrEmpty(comment) ? (";" + comment) : ""));
stringBuilder.AppendLine(content);
isModified = true;
}
else
{
Match match = matches[0];
string valueContent = match.Groups["valueContent"].Value;
string[] lines = valueContent.Split(new string[] { "\r\n" }, System.StringSplitOptions.None);
newValueContent.AppendLine(string.Format("[{0}]", section));
foreach (string line in lines)
{
if (string.IsNullOrEmpty(line) || line == "\r\n" || line.Contains("["))
{
continue;
}
string valueLine = line;
string comments = "";
if (line.Contains(";"))
{
string[] seqPairs = line.Split(';');
if (seqPairs.Length > 1)
comments = seqPairs[1].Trim();
valueLine = seqPairs[0];
}
string[] keyValuePairs = valueLine.Split('=');
string line_key = keyValuePairs[0];
string line_value = "";
if (keyValuePairs.Length > 1)
{
line_value = keyValuePairs[1];
}
if (key.ToLower().Trim() == line_key.ToLower().Trim())
{
isModified = true;
newValueContent.AppendLine(string.Format("{0}={1}{2}", key, value, !string.IsNullOrEmpty(comment) ? (";" + comment) : ""));
}
else
{
newValueContent.AppendLine(line);
}
}
if (!isModified)
newValueContent.AppendLine(string.Format("{0}={1}{2}", key, value, !string.IsNullOrEmpty(comment) ? (";" + comment) : ""));
string newVal = newValueContent.ToString();
content = content.Replace(match.Value, newVal);
stringBuilder.Append(content);
}
}
#endregion
#region 没有指明节点
else
{
string valueText = "";
//如果节点为空
MatchCollection matches = new Regex(@"\[\s*(?'section'[^\[\]\s]+)\s*\](?'valueContent'[^\[\]]*)").Matches(content);
if (matches.Count > 0)
{
valueText = matches[0].Index > 0 ? content.Substring(0, matches[0].Index) : "";
string[] lines = valueText.Split(new string[] { "\r\n" }, System.StringSplitOptions.None);
foreach (string line in lines)
{
if (string.IsNullOrEmpty(line) || line == "\r\n" || line.Contains("["))
{
continue;
}
string valueLine = line;
string comments = "";
if (line.Contains(";"))
{
string[] seqPairs = line.Split(';');
if (seqPairs.Length > 1)
comments = seqPairs[1].Trim();
valueLine = seqPairs[0];
}
string[] keyValuePairs = valueLine.Split('=');
string line_key = keyValuePairs[0];
string line_value = "";
if (keyValuePairs.Length > 1)
{
line_value = keyValuePairs[1];
}
if (key.ToLower().Trim() == line_key.ToLower().Trim())
{
isModified = true;
newValueContent.AppendLine(string.Format("{0}={1}{2}", key, value, !string.IsNullOrEmpty(comment) ? (";" + comment) : ""));
}
else
{
newValueContent.AppendLine(line);
}
}
if (!isModified)
newValueContent.AppendLine(string.Format("{0}={1}{2}", key, value, !string.IsNullOrEmpty(comment) ? (";" + comment) : ""));
string newVal = newValueContent.ToString();
content = content.Replace(valueText, newVal);
stringBuilder.Append(content);
}
else
{
stringBuilder.AppendLine(string.Format("{0}={1}{2}", key, value, !string.IsNullOrEmpty(comment) ? (";" + comment) : ""));
}
}
#endregion
System.IO.File.WriteAllText(file, stringBuilder.ToString(), Encoding);
}
/**
* 持久化选中的图纸信息
* */
public void LocalStorageVo(object sender)
{
Type t = sender.GetType();//获得该类的Type
//再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了
foreach (PropertyInfo pi in t.GetProperties())
{
object value = pi.GetValue(sender, null);//用pi.GetValue获得值
if(null == value)
{
value = new object();
}
//获得属性的名字,后面就可以根据名字判断来进行些自己想要的操作
string name = pi.Name;
this.Write(name, value.ToString());
}
}
}
public class IniStruct : System.Collections.IEnumerable
{
private System.Collections.Generic.List _commentList;
public IniStruct()
{
this._keyValuePairs = new System.Collections.Generic.SortedList();
_commentList = new System.Collections.Generic.List();
}
public string GetComment(string key)
{
if (this._keyValuePairs.ContainsKey(key))
{
int index = this._keyValuePairs.IndexOfKey(key);
return this._commentList[index];
}
return "";
}
public string this[int index]
{
get
{
if (this._keyValuePairs.Count > index)
return this._keyValuePairs.Values[index];
else return "";
}
set
{
if (this._keyValuePairs.Count > index)
this._keyValuePairs.Values[index] = value;
}
}
public string this[string key]
{
get
{
if (this._keyValuePairs.ContainsKey(key))
return this._keyValuePairs[key];
else return "";
}
set
{
if (this._keyValuePairs.ContainsKey(key))
this._keyValuePairs[key] = value;
}
}
public string Section { get; set; }
private System.Collections.Generic.SortedList _keyValuePairs;
public void Add(string key, string value, string commont)
{
this._keyValuePairs.Add(key, value);
this._commentList.Add(commont);
}
public override string ToString()
{
return string.Format("{0}", this.Section);
}
public bool ContainKey(string key)
{
return this._keyValuePairs.ContainsKey(key);
}
public System.Collections.IEnumerator GetEnumerator()
{
return this._keyValuePairs.GetEnumerator();
}
}
}
其中FileUtil.GetAssemblyPath()是获取项目运行时当前目录路径。我们也可以换掉iniFile为其它路径,代码如下:
///
/// 获取Assembly的运行路径
///
///
public static string GetAssemblyPath()
{
string _CodeBase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
_CodeBase = _CodeBase.Substring(8, _CodeBase.Length - 8); // 8是file:// 的长度
string[] arrSection = _CodeBase.Split(new char[] { '/' });
string _FolderPath = "";
for (int i = 0; i < arrSection.Length - 1; i++)
{
_FolderPath += arrSection[i] + "/";
}
return _FolderPath;
}
读取默认的main节名下键值。
指定节名。读取键值
读取所有的键值对
写键值对,默认在main下
指定节名,保存健值对
初始化工具类
2个构造方法,一个传配置文件路径参数,一个默认。
INIUtil iniUtil = new INIUtil();
//或者
INIUtil iniUtil = new INIUtil(@"D:\test");
默认将key-value保存到节名(section)为main的区域下,当然我们可以指定保存其它节名(section)。
取值:string name= iniUtil.ReadValue(“name”);
保存值:iniUtil.Write(“name”, “张三”);