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.

315 lines
10 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;
using System.Collections.Generic;
using System.Xml;
using System.Text;
using System.IO;
namespace Mesnac.Basic
{
/// <summary>
/// 组态工程运行配置解析类
/// </summary>
public class RunSchema
{
#region 定义变量
private string _projectPath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(typeof(RunSchema).Assembly.CodeBase).Replace("file:\\", String.Empty), "Data", "MCProject"); //组态工程路径
private string _eventConfigPath = String.Empty; //事件处理Action配置文件路径
private string _runSchemaFilePath = "RunSchema.xml"; //运行结构配置文件路径
private Dictionary<string, string> _runSchemaDic = new Dictionary<string, string>();
#endregion
#region 定义属性
public Dictionary<string, string> RunSchemaDic
{
get
{
if (_runSchemaDic.Count == 0)
{
ParseFromRunSchema();
}
return _runSchemaDic;
}
private set
{
_runSchemaDic = value;
}
}
/// <summary>
/// 组态工程路径
/// </summary>
public string ProjectPath
{
get { return this._projectPath; }
set { this._projectPath = value; }
}
/// <summary>
/// 事件处理Action配置文件路径
/// </summary>
public string EventConfigPath
{
get { return this._eventConfigPath; }
set { this._eventConfigPath = value; }
}
#endregion
#region 单例模式实现
private static RunSchema _this; //私有静态实例,保存全局作用域中的唯一实例
/// <summary>
/// 静态实例属性
/// </summary>
public static RunSchema Instance
{
get
{
if (null == _this)
_this = new RunSchema();
return _this;
}
}
/// <summary>
/// 私有构造方法
/// </summary>
private RunSchema()
{
this._runSchemaDic = new Dictionary<string, string>();
}
#endregion
#region 基本信息
public string FilePath()
{
return Path.Combine(this._projectPath, this._runSchemaFilePath);
}
#endregion
#region 检测配置文件是否存在
/// <summary>
/// 检测配置文件是否存在先检测组态工程目录在检测事件处理Action配置文件路径
/// </summary>
/// <returns>存在返回true否则返回false</returns>
public bool Exists()
{
string runSchemaFile = FilePath();
string runSchemaFile2 = Path.Combine(this._eventConfigPath, this._runSchemaFilePath);
if (File.Exists(runSchemaFile) || File.Exists(runSchemaFile2))
{
return true;
}
else
{
return false;
}
}
#endregion
#region 解析运行环境主配置文件RunSchema.xml
/// <summary>
/// 解析运行环境主配置文件RunSchema.xml
/// </summary>
public void ParseFromRunSchema()
{
try
{
//如果组态工程目录MCProject下有RunSchema文件则首先以组态工程目录下的文件为配置文件
//否则以事件处理Action配置文件所在的目录下的RunSchema文件为准
string runSchemaFile = FilePath();
Dictionary<string, string> dic = new Dictionary<string, string>();
if (!File.Exists(runSchemaFile))
{
runSchemaFile = Path.Combine(this._eventConfigPath, this._runSchemaFilePath);
}
if (File.Exists(runSchemaFile))
{
XmlDocument doc = new XmlDocument();
doc.Load(runSchemaFile);
XmlNodeList nodeList = doc.GetElementsByTagName("add");
foreach (XmlNode node in nodeList)
{
string key = node.Attributes["key"].Value;
if (!dic.ContainsKey(key))
{
string value = node.Attributes["value"].Value;
dic.Add(key, value);
}
else
{
//存在重复键
ICSharpCode.Core.LoggingService<RunSchema>.Error("配置文件中存在重复键的配置项key = " + key);
}
}
}
else
{
//配置文件不存在
ICSharpCode.Core.LoggingService<RunSchema>.Warn("应用程序配置文件不存在!");
}
this._runSchemaDic = dic;
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService<RunSchema>.Error(ex.Message);
throw ex;
}
}
/// <summary>
/// 保存配置信息
/// </summary>
/// <param name="dic"></param>
/// <param name="runSchemaFile"></param>
public void UpdateToRunSchema(Dictionary<string, string> dic)
{
string runSchemaFile = FilePath();
if (dic != null && dic.Count > 0)
{
XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("configuration");
foreach (string key in dic.Keys)
{
XmlElement eAdd = doc.CreateElement("add");
XmlAttribute eAttKey = doc.CreateAttribute("key");
eAttKey.Value = key;
XmlAttribute eAttValue = doc.CreateAttribute("value");
eAttValue.Value = dic[key];
eAdd.Attributes.Append(eAttKey);
eAdd.Attributes.Append(eAttValue);
root.AppendChild(eAdd);
}
doc.AppendChild(root);
doc.Save(runSchemaFile);
}
ParseFromRunSchema();
}
/// <summary>
/// 更新配置节点至文件
/// </summary>
/// <param name="key">要更新的配置项</param>
/// <param name="newValue">要更新的配置项的值</param>
public void UpdateNodeValueToRunSchema(string key, string newValue)
{
try
{
string runSchemaFile = FilePath();
if (File.Exists(runSchemaFile))
{
XmlDocument doc = new XmlDocument();
doc.Load(runSchemaFile);
XmlNodeList nodeList = doc.GetElementsByTagName("add");
bool flag = false;
foreach (XmlNode node in nodeList)
{
if (node.Attributes["key"].Value == key)
{
node.Attributes["value"].Value = newValue;
flag = true;
break;
}
}
if (!flag)
{
XmlElement eAdd = doc.CreateElement("add");
XmlAttribute eAttKey = doc.CreateAttribute("key");
eAttKey.Value = key;
XmlAttribute eAttValue = doc.CreateAttribute("value");
eAttValue.Value = newValue;
eAdd.Attributes.Append(eAttKey);
eAdd.Attributes.Append(eAttValue);
doc.DocumentElement.AppendChild(eAdd);
}
doc.Save(runSchemaFile);
}
else
{
//配置文件不存在
ICSharpCode.Core.LoggingService<RunSchema>.Warn("应用程序配置文件不存在!");
}
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService<RunSchema>.Error(ex.Message);
throw ex;
}
ParseFromRunSchema();
}
#endregion
#region 获取RunSchema配置文件中配置项的值
/// <summary>
/// 获取RunSchema配置文件中配置项的值
/// </summary>
/// <param name="key">配置型</param>
/// <param name="defaultValue">获取不到时的默认值</param>
/// <returns>返回对应配置项的值</returns>
public string GetConfigValue(string key, string defaultValue)
{
string value = string.Empty;
if (this.RunSchemaDic.TryGetValue(key, out value))
{
return value;
}
return defaultValue;
}
public bool GetConfigValue(string key, bool defaultValue)
{
string value = GetConfigValue(key, String.Empty);
bool result = defaultValue;
if (bool.TryParse(value, out result))
{
return result;
}
else
{
return defaultValue;
}
}
public int GetConfigValue(string key, int defaultValue)
{
string value = GetConfigValue(key, String.Empty);
int result = defaultValue;
if (int.TryParse(value, out result))
{
return result;
}
else
{
return defaultValue;
}
}
#endregion
#region 判断Schema文件是否存在
/// <summary>
/// 判断Schema文件是否存在
/// </summary>
/// <returns>存在返回true失败返回false</returns>
public bool IsSchemaExists()
{
string runSchemaFile = FilePath();
if (File.Exists(runSchemaFile))
{
return true;
}
else
{
return false;
}
}
#endregion
}
}