各种配置文件的读取和设置

一、定义的接口规范

using System;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// 配置接口
 /// </summary>
 public interface IConfig
 {
  /// <summary>
  /// 获取配置的值
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <returns>返回获取的配置值</returns>
  string GetConfig(string configField);
  /// <summary>
  /// 设置配置的值
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  void SetConfig(string configField,string configValue);
  /// <summary>
  /// 增加一个配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  void AddConfig(string configField,string configValue);
  /// <summary>
  /// 删除一个配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  void RemoveConfig(string configField);
 }
}

二、ini文件配置

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// IniConfig 的摘要说明。
 /// </summary>
 public class IniConfig:IConfig
 {
  private  string fileName;
  private IDataSecurity iDataSecurity;
  //*写ini文件
  [DllImport("kernel32")]
  private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);
  //读ini文件
  [DllImport("kernel32")]
  private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);
  /// <summary>
  /// 构造函数
  /// </summary>
  /// <param name="filename">配置文件名字</param>
  /// <param name="ids">加密解密方法</param>
  public IniConfig(string filename,IDataSecurity ids)
  {
   fileName=filename;
   iDataSecurity=ids;
  }
  #region IConfig 成员

  

  /// <summary>
  /// 获取相应的配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <returns>如果取到该值返回对应值</returns>
  public string GetConfig(string configField)
  {
   System.Text.StringBuilder str = new StringBuilder(255);
   GetPrivateProfileString("configs",configField,"",str,255,fileName);
   return iDataSecurity.Decrypt(str.ToString());
  }

  /// <summary>
  /// 设置配置字段
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  public void SetConfig(string configField, string configValue)
  {
   WritePrivateProfileString("configs",configField,iDataSecurity.Encrypt(configValue),fileName);
  }

  /// <summary>
  /// 增加一个配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  public void AddConfig(string configField, string configValue)
  {
   // TODO:  添加 IniConfig.AddConfig 实现
   WritePrivateProfileString("configs",configField,iDataSecurity.Encrypt(configValue),fileName);
  }

  /// <summary>
  /// 移除一个配置,未实现
  /// </summary>
  /// <param name="configField">配置字段</param>
  public void RemoveConfig(string configField)
  {
   // TODO:  添加 IniConfig.RemoveConfig 实现
  }

  #endregion
 }
}

 

*.ini文件内容

[configs]'基本配置
database=391A9BAB8D7CE1AD

三、web.config的配置

using System;
using System.Xml;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// WebConfig 的摘要说明。
 /// </summary>
 public class WebConfig:IConfig
 {
        private System.Xml.XmlDocument xmlDoc;
  private string fileName;
  private IDataSecurity iDataSecurity;
  /// <summary>
  /// 构造函数
  /// </summary>
  /// <param name="filename">配置文件名字</param>
  /// <param name="ids">加密解密类</param>
  public WebConfig(string filename,IDataSecurity ids)
  {
   xmlDoc=new XmlDocument();
   fileName=filename;
   iDataSecurity=ids;
   try
   { 
    xmlDoc.Load(filename);
    
   }
   catch
   {
    xmlDoc=null;
   }
  }
  #region IConfig 成员

  /// <summary>
  /// 获取相应的配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <returns>如果取到该值返回对应值,没有则返回null</returns>
  public string GetConfig(string configField)
  {
   // TODO:  添加 WebConfig.GetConfig 实现
   XmlNode xmlNode=xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='" +configField +"']");
   if(xmlNode==null)
   {
    return null;
   }
   return iDataSecurity.Decrypt(xmlNode.Attributes["value"].Value);
  }

  /// <summary>
  /// 设置配置字段
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  public void SetConfig(string configField, string configValue)
  {
   XmlElement xmlNode=(XmlElement)xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='" +configField +"']");
   if(xmlNode==null)
    return;
   xmlNode.SetAttribute("value",iDataSecurity.Encrypt(configValue));
   xmlDoc.Save(fileName);
  }

  /// <summary>
  /// 增加一个配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  public void AddConfig(string configField, string configValue)
  {
   XmlNode node=xmlDoc.SelectSingleNode("configuration/appSettings");
   XmlElement insertNode=xmlDoc.CreateElement("add");
   insertNode.SetAttribute("key",configField);
   insertNode.SetAttribute("value",iDataSecurity.Encrypt(configValue));
   node.AppendChild(insertNode);

   xmlDoc.Save(fileName);
  }
  /// <summary>
  /// 移除一个配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  public void RemoveConfig(string configField)
  {
   if(configField.Length==0)
   {
    return;
   }
   XmlNode xmlNode=xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='" +configField +"']");
   if(xmlNode!=null)
   {
    xmlNode.ParentNode.RemoveChild(xmlNode);
    
   }
   xmlDoc.Save(fileName);
  }

  #endregion
 }
}

四 、上述的加密接口

using System;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// 数据安全类
 /// </summary>
 public interface IDataSecurity
 {
  /// <summary>
  /// 加密方法
  /// </summary>
  /// <param name="input">输入字符串</param>
  /// <returns>加密后的返回值</returns>
  string Encrypt(string input);
  /// <summary>
  /// 解密方法
  /// </summary>
  /// <param name="input">输入字符串</param>
  /// <returns>解密后的返回值</returns>
  string Decrypt(string input);
 }
}
五、实现的加密类

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// DataSecurityDES 的摘要说明。
 /// </summary>
 public class DataSecurityDES:IDataSecurity
 {
  private string key;
  /// <summary>
  /// 构造函数
  /// </summary>
  /// <param name="paraKey">DES加密解密钥</param>
  public DataSecurityDES(string paraKey)
  {
   key=paraKey;
   if(key.Length<8)
    key+="12345678";
  }
  #region IDataSecurity 成员

  /// <summary>
  /// 加密方法
  /// </summary>
  /// <param name="input">输入的值</param>
  /// <returns>加密后的值</returns>
  public string Encrypt(string input)
  {
   if(input.Length==0)
   {
    return "";
   }
   //return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(input,"MD5");
   DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   //把字符串放到byte数组中
   //原来使用的UTF8编码,我改成Unicode编码了,不行
   byte[] inputByteArray = Encoding.Default.GetBytes(input);

   //建立加密对象的密钥和偏移量
   //使得输入密码必须输入英文文本
   des.Key = ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
   des.IV = ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
   MemoryStream ms = new MemoryStream();
   CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(),CryptoStreamMode.Write);

   cs.Write(inputByteArray, 0, inputByteArray.Length);
   cs.FlushFinalBlock();
   StringBuilder ret = new StringBuilder();
   foreach(byte b in ms.ToArray())
   {
    ret.AppendFormat("{0:X2}", b);
   }
   ret.ToString();
   return ret.ToString();
  }

  /// <summary>
  /// 解密方法
  /// </summary>
  /// <param name="input">输入值</param>
  /// <returns>解密后的值</returns>
  public string Decrypt(string input)
  {
   if(input.Length==0)
   {
    return "";
   }
   System.Security.Cryptography.DESCryptoServiceProvider des=new DESCryptoServiceProvider();
   byte[] inputByteArray=new byte[input.Length/2];
   int leng=inputByteArray.Length;
   for(int i = 0; i < input.Length / 2;i++)
   {
    string stt=input.Substring(i * 2, 2);
    int temp = Convert.ToInt32(input.Substring(i * 2, 2), 16);
    inputByteArray[i] = (byte)temp;
   }
   des.Key=System.Text.ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
   des.IV=System.Text.ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
   MemoryStream ms = new MemoryStream();
   CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(),CryptoStreamMode.Write);
   cs.Write(inputByteArray, 0, inputByteArray.Length);
   cs.FlushFinalBlock();
   //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象
   //StringBuilder ret = new StringBuilder();
   return System.Text.Encoding.Default.GetString(ms.ToArray());

  }

  #endregion
 }
}
其余的配置都可从实现该接口来配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值