You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

282 lines
9.2 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
namespace GeoSigma.SigmaDrawerUtil
{
public class XmlConfig
{
public virtual string SectionName { get; set; }
public string FileName; //INI文件名
string fileName = "\\SigmaConfig.xml";
XDocument xmlDoc;
private XElement sectionElement;
/// <summary>
/// 构造函数
/// </summary>
public XmlConfig()
{
if(string.IsNullOrEmpty(SectionName))
{
return;
}
var path = Application.StartupPath;
var strXmlFile = path + fileName;
if (!File.Exists(strXmlFile))
{
xmlDoc = new XDocument();
}
else
{
xmlDoc = XDocument.Load(strXmlFile);
}
// 取到根结点
XElement rootEle = xmlDoc.Element("Config");
if(rootEle == null)
{
xmlDoc.Add(new XElement("Config"));
rootEle = xmlDoc.Element("Config");
}
sectionElement = rootEle.Element(SectionName);
if (sectionElement == null)
{
rootEle.Add(new XElement(SectionName));
sectionElement = rootEle.Element(SectionName);
}
}
/// <summary>
/// 相关属性
/// </summary>
public virtual void ResetAttributes()
{
if (SectionAttributes != null && SectionAttributes.Count > 0)
{
for (int i = 0; i < SectionAttributes.Count; i++)
{
XAttribute attr = sectionElement.Attribute(SectionAttributes[i].Name);
if (attr != null)
{
attr.Value = SectionAttributes[i].Value;
}
else
{
sectionElement.Add(SectionAttributes[i]);
}
}
}
}
public List<XAttribute> SectionAttributes
{
get;
set;
} = new List<XAttribute>();
public string GetValue(string key)
{
string strValue = sectionElement.Element(key)?.Value;
return strValue;
}
public void SetValue(string key, string value)
{
XElement ele = sectionElement.Element(key);
if(ele == null)
{
sectionElement.Add(new XElement(key, value));
}
else
{
ele.Value = value;
}
}
public void ResetValues(string key, List<string> values)
{
List<XElement> elements = sectionElement.Elements(key).ToList();
for(int i = 0; i < elements.Count; i++)
{
elements[i].Remove();
}
foreach(string eleValue in values)
{
sectionElement.Add(new XElement(key, eleValue));
}
}
public void Save()
{
var path = Application.StartupPath;
var strXmlFile = path + fileName;
xmlDoc?.Save(strXmlFile);
}
/// <summary>
/// 查找所有指定键对应的值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public List<string> FindValues(string key)
{
IEnumerable<string> eles =
from ele in sectionElement.Elements()
where ele.Name.ToString().Equals(key)
select ele.Value;
return eles?.ToList();
}
////写INI文件
//public void WriteString(string Section, string Ident, string Value)
//{
// if (!WritePrivateProfileString(Section, Ident, Value, FileName))
// {
// throw (new ApplicationException("写Ini文件出错"));
// }
//}
////读取INI文件指定
//public string ReadString(string Section, string Ident, string Default)
//{
// Byte[] Buffer = new Byte[65535];
// int bufLen = GetPrivateProfileString(Section, Ident, Default, Buffer, Buffer.GetUpperBound(0), FileName);
// //必须设定0系统默认的代码页的编码方式否则无法支持中文
// string s = Encoding.GetEncoding(0).GetString(Buffer);
// s = s.Substring(0, bufLen);
// return s.Trim();
//}
////读整数
//public int ReadInteger(string Section, string Ident, int Default)
//{
// string intStr = ReadString(Section, Ident, Convert.ToString(Default));
// try
// {
// return Convert.ToInt32(intStr);
// }
// catch (Exception ex)
// {
// Console.WriteLine(ex.Message);
// return Default;
// }
//}
////写整数
//public void WriteInteger(string Section, string Ident, int Value)
//{
// WriteString(Section, Ident, Value.ToString());
//}
////读布尔
//public bool ReadBool(string Section, string Ident, bool Default)
//{
// try
// {
// return Convert.ToBoolean(ReadString(Section, Ident, Convert.ToString(Default)));
// }
// catch (Exception ex)
// {
// Console.WriteLine(ex.Message);
// return Default;
// }
//}
////写Bool
//public void WriteBool(string Section, string Ident, bool Value)
//{
// WriteString(Section, Ident, Convert.ToString(Value));
//}
////从Ini文件中将指定的Section名称中的所有Ident添加到列表中
//public void ReadSection(string section, StringCollection Idents)
//{
// Byte[] Buffer = new Byte[16384];
// //Idents.Clear();
// int bufLen = GetPrivateProfileString(section, null, null, Buffer, Buffer.GetUpperBound(0), FileName);
// //对Section进行解析
// GetStringsFromBuffer(Buffer, bufLen, Idents);
//}
//private void GetStringsFromBuffer(Byte[] Buffer, int bufLen, StringCollection Strings)
//{
// Strings.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);
// Strings.Add(s);
// start = i + 1;
// }
// }
// }
//}
////从Ini文件中读取所有的Sections的名称
//public void ReadSections(StringCollection SectionList)
//{
// //Note:必须得用Bytes来实现StringBuilder只能取到第一个Section
// byte[] Buffer = new byte[65535];
// int bufLen = 0;
// bufLen = GetPrivateProfileString(null, null, null, Buffer,
// Buffer.GetUpperBound(0), FileName);
// GetStringsFromBuffer(Buffer, bufLen, SectionList);
//}
////读取指定的Section的所有Value到列表中
//public void ReadSectionValues(string Section, NameValueCollection Values)
//{
// StringCollection KeyList = new StringCollection();
// ReadSection(Section, KeyList);
// Values.Clear();
// foreach (string key in KeyList)
// {
// Values.Add(key, ReadString(Section, key, ""));
// }
//}
////清除某个Section
//public void EraseSection(string Section)
//{
// if (!WritePrivateProfileString(Section, null, null, FileName))
// {
// throw (new ApplicationException("无法清除Ini文件中的Section"));
// }
//}
////删除某个Section下的键
//public void DeleteKey(string Section, string Ident)
//{
// WritePrivateProfileString(Section, Ident, null, FileName);
//}
////Note:对于Win9X来说需要实现UpdateFile方法将缓冲中的数据写入文件
////在Win NT, 2000和XP上都是直接写文件没有缓冲所以无须实现UpdateFile
////执行完对Ini文件的修改之后应该调用本方法更新缓冲区。
//public void UpdateFile()
//{
// WritePrivateProfileString(null, null, null, FileName);
//}
////检查某个Section下的某个键值是否存在
//public bool ValueExists(string Section, string Ident)
//{
// StringCollection Idents = new StringCollection();
// ReadSection(Section, Idents);
// return Idents.IndexOf(Ident) > -1;
//}
////确保资源的释放
//~Config()
//{
// UpdateFile();
//}
}
}