From a2df92998fe8ed13d7a3fb5fd650f50df77294f9 Mon Sep 17 00:00:00 2001
From: lhiven <236881222@qq.com>
Date: Tue, 13 Jun 2023 08:04:20 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0INI=E6=96=87=E4=BB=B6?=
=?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Rs.Framework/IniHelper.cs | 228 +++++++++++++++++++++++++++++++
Rs.Framework/Rs.Framework.csproj | 1 +
2 files changed, 229 insertions(+)
create mode 100644 Rs.Framework/IniHelper.cs
diff --git a/Rs.Framework/IniHelper.cs b/Rs.Framework/IniHelper.cs
new file mode 100644
index 0000000..5947cd1
--- /dev/null
+++ b/Rs.Framework/IniHelper.cs
@@ -0,0 +1,228 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Rs.Framework
+{
+ public class IniHelper
+ {
+ ///
+ /// Ini文件完整路径
+ ///
+ public string IniPath { get; set; }
+
+ ///
+ /// 构造方法
+ ///
+ public IniHelper() { }
+
+ ///
+ /// 构造方法
+ ///
+ /// Ini文件的完整路径,包括文件名
+ public IniHelper(string path)
+ {
+ IniPath = path;
+ }
+
+ #region win32函数
+ ///
+ /// 写操作
+ ///
+ /// Ini文件中的段落
+ /// Ini文件中的关键字
+ /// 关键字的值
+ /// Ini文件的完整路径
+ ///
+ [DllImport("kernel32")]
+ private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath);
+
+ ///
+ /// 读操作
+ ///
+ /// Ini文件中的段落
+ /// Ini文件中的关键字
+ /// 无法读取时的缺省值
+ /// 读取的值
+ /// 值的大小
+ /// Ini文件的完整路径
+ ///
+ [DllImport("kernel32")]
+ private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);
+ #endregion
+
+ ///
+ /// Ini文件写入
+ ///
+ /// Ini文件段落
+ ///
+ /// 值
+ public void WriteValue(string section, string key, string value)
+ {
+ bool b = WritePrivateProfileString(section, key, value, IniPath);
+ if (!b) throw new Exception("Ini文件写入错误");
+ }
+
+ ///
+ /// 读取指定的Section和Ident的值
+ ///
+ /// Ini文件段落
+ /// 关键字
+ /// 值
+ public string ReadValue(string section, string key)
+ {
+ return ReadValue(section, key, "");
+ }
+
+ ///
+ /// 读取指定的Section和Ident的值
+ ///
+ /// Ini文件段落
+ /// 关键字
+ /// 读取失败时的默认值
+ /// 值
+ public string ReadValue(string section, string key, string defaultValue)
+ {
+ byte[] buffer = new byte[65535];
+ int bufLen = GetPrivateProfileString(section, key, defaultValue, buffer, buffer.GetUpperBound(0), IniPath);
+ string s = Encoding.GetEncoding(0).GetString(buffer);
+ s = s.Substring(0, bufLen);
+ return s.Trim();
+ }
+
+ ///
+ /// 获取指定Section下的所有Ident
+ ///
+ ///
+ ///
+ public void ReadSection(string section, StringCollection keys)
+ {
+ byte[] buffer = new byte[16384];
+ int bufLen = GetPrivateProfileString(section, null, null, buffer, buffer.GetUpperBound(0), IniPath);
+
+ GetStringsFromBuffer(buffer, bufLen, keys);
+ }
+
+ ///
+ /// 解析Section
+ ///
+ ///
+ ///
+ ///
+ private static void GetStringsFromBuffer(byte[] buffer, int bufLen, StringCollection keys)
+ {
+ keys.Clear();
+ if (bufLen != 0)
+ {
+ int start = 0;
+ for (int i = 0; i < bufLen; i++)
+ {
+ if ((buffer[i] == 0) && ((i - start) > 0))
+ {
+ string s = Encoding.GetEncoding(0).GetString(buffer, start, i - start);
+ keys.Add(s);
+ start = i + 1;
+ }
+ }
+ }
+ }
+
+ ///
+ /// 获取Sections
+ ///
+ ///
+ public void ReadSections(StringCollection sections)
+ {
+ byte[] buffer = new byte[65535];
+ int bufLen = GetPrivateProfileString(null, null, null, buffer, buffer.GetUpperBound(0), IniPath);
+
+ GetStringsFromBuffer(buffer, bufLen, sections);
+ }
+
+ ///
+ /// 获取指定Section下的所有Value
+ ///
+ ///
+ ///
+ public void ReadSectionValues(string section, NameValueCollection values)
+ {
+ StringCollection idents = new StringCollection();
+ ReadSection(section, idents);
+ values.Clear();
+ foreach (string ident in idents)
+ {
+ values.Add(ident, ReadValue(section, ident, ""));
+ }
+ }
+
+ ///
+ /// 清除指定的Section
+ ///
+ ///
+ public void EraseSection(string section)
+ {
+ bool b = WritePrivateProfileString(section, null, null, IniPath);
+ if (!b) throw new Exception("无法清除Ini文件中的Section");
+ }
+
+ ///
+ /// 删除指定Section下的指定键
+ ///
+ ///
+ ///
+ public void DeleteIdent(string section, string key)
+ {
+ bool b = WritePrivateProfileString(section, key, null, IniPath);
+ if (!b) throw new Exception("无法删除指定的Ident");
+ }
+
+ ///
+ /// 检查指定的键是否有值
+ ///
+ ///
+ ///
+ ///
+ public bool ValueExists(string section, string key)
+ {
+ StringCollection keys = new StringCollection();
+ ReadSection(section, keys);
+ return keys.IndexOf(key) > -1;
+ }
+
+ ///
+ /// 执行完对Ini文件的操作后,
+ /// 调用本方法更新缓冲区,
+ /// 对于Win9X,执行此方法,
+ /// 对于Win NT及更高的系统上,则不需执行此方法
+ ///
+ public void UpdateFile()
+ {
+ WritePrivateProfileString(null, null, null, IniPath);
+ }
+
+ ///
+ /// 验证文件是否存在
+ ///
+ ///
+ public bool ExistIniFile
+ {
+ get
+ {
+ if (string.IsNullOrEmpty(IniPath))
+ throw new ArgumentException("IniPath");
+
+ return File.Exists(IniPath);
+ }
+ }
+
+ ~IniHelper()
+ {
+ UpdateFile();
+ }
+ }
+}
diff --git a/Rs.Framework/Rs.Framework.csproj b/Rs.Framework/Rs.Framework.csproj
index 1d3b5f7..bb29339 100644
--- a/Rs.Framework/Rs.Framework.csproj
+++ b/Rs.Framework/Rs.Framework.csproj
@@ -45,6 +45,7 @@
+