這段時間一直在修改日志模塊,現在基本上寫好了,也把注釋什麼的都加上了,昨天郵件發送給mark的園友一直報失敗,老是退回來,真是報歉,如下圖所示:
沒有辦法,只好放這裡了,想看源代碼的請猛戳這裡
如果有什麼問題,歡迎跟我交流!
從今天開始寫Util模塊,這個模塊幾乎所有的系統項目都需要的,想減少重復代碼的編寫,就依靠這個模塊了.大的模塊主要是以下幾個方面:
1.加解密
這個我也不多說了,也就是MD5等加密算法:
using System;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// 加解密相關操作類
/// </summary>
/// <date>2012-02-20</date>
/// <author>xucj</author>
public class Cryptography
{
private const string DefaultKey = "OD";
/// <summary>
/// 構造方法
/// </summary>
public Cryptography()
{
}
/// <summary>
/// 使用缺省密鑰字符串加密
/// </summary>
/// <param name="original">明文</param>
/// <returns>密文</returns>
public static string Encrypt(string original)
{
return Encrypt(original, DefaultKey);
}
/// <summary>
/// 使用缺省密鑰解密
/// </summary>
/// <param name="original">密文</param>
/// <returns>明文</returns>
public static string Decrypt(string original)
{
return Decrypt(original, DefaultKey, System.Text.Encoding.Default);
}
/// <summary>
/// 使用給定密鑰解密
/// </summary>
/// <param name="original">密文</param>
/// <param name="key">密鑰</param>
/// <returns>明文</returns>
public static string Decrypt(string original, string key)
{
return Decrypt(original, key, System.Text.Encoding.Default);
}
/// <summary>
/// 使用缺省密鑰解密,返回指定編碼方式明文
/// </summary>
/// <param name="original">密文</param>
/// <param name="encoding">編碼方式</param>
/// <returns>明文</returns>
public static string Decrypt(string original, Encoding encoding)
{
return Decrypt(original, DefaultKey, encoding);
}
/// <summary>
/// 使用給定密鑰加密
/// </summary>
/// <param name="original">原始文字</param>
/// <param name="key">密鑰</param>
/// <returns>密文</returns>
public static string Encrypt(string original, string key)
{
byte[] buff = System.Text.Encoding.Default.GetBytes(original);
byte[] kb = System.Text.Encoding.Default.GetBytes(key);
return Convert.ToBase64String(Encrypt(buff, kb));
}
/// <summary>
/// 使用給定密鑰解密
/// </summary>
/// <param name="encrypted">密文</param>
/// <param name="key">密鑰</param>
/// <param name="encoding">字符編碼方案</param>
/// <returns>明文</returns>
public static string Decrypt(string encrypted, string key, Encoding encoding)
{
byte[] buff = Convert.FromBase64String(encrypted);
byte[] kb = System.Text.Encoding.Default.GetBytes(key);
return encoding.GetString(Decrypt(buff, kb));
}
/// <summary>
/// 生成MD摘要
/// </summary>
/// <param name="original">數據源</param>
/// <returns>摘要</returns>
private static byte[] MakeMD(byte[] original)
{
MD5CryptoServiceProvider hashmd = new MD5CryptoServiceProvider();
byte[] keyhash = hashmd.ComputeHash(original);
hashmd = null;
return keyhash;
}
/// <summary>
/// 使用給定密鑰加密
/// </summary>
/// <param name="original">明文</param>
/// <param name="key">密鑰</param>
/// <returns>密文</returns>
private static byte[] Encrypt(byte[] original, byte[] key)
{
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = MakeMD(key);
des.Mode = CipherMode.ECB;
return des.CreateEncryptor().TransformFinalBlock(original, 0, original.Length);
}
/// <summary>
/// 使用給定密鑰解密數據
/// </summary>
/// <param name="encrypted">密文</param>
/// <param name="key">密鑰</param>
/// <returns>明文</returns>
private static byte[] Decrypt(byte[] encrypted, byte[] key)
{
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = MakeMD(key);
des.Mode = CipherMode.ECB;
return des.CreateDecryptor().TransformFinalBlock(encrypted, 0, encrypted.Length);
}
/// <summary>
/// 使用給定密鑰加密
/// </summary>
/// <param name="original">原始數據</param>
/// <returns>密文</returns>
private static byte[] Encrypt(byte[] original)
{
byte[] key = System.Text.Encoding.Default.GetBytes(DefaultKey);
return Encrypt(original, key);
}
/// <summary>
/// 使用缺省密鑰解密數據
/// </summary>
/// <param name="encrypted">密文</param>
/// <returns>明文</returns>
private static byte[] Decrypt(byte[] encrypted)
{
byte[] key = System.Text.Encoding.Default.GetBytes(DefaultKey);
return Decrypt(encrypted, key);
}
public static string SimpEncrypt(string str)
{
StringBuilder asc = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
int b = char.Parse(str.Substring(i, 1)) + '\x0003';
asc.Append((char)b);
}
return asc.ToString();
}
public static string SimpUnEncrypt(string str)
{
StringBuilder asc = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
int b = char.Parse(str.Substring(i, 1)) - '\x0003';
asc.Append((char)b);
}
return asc.ToString();
}
}
2.配置文件相關操作
xml,ini配置文件的讀寫方法:
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Collections;
using System.IO;
using System.Collections.Generic;
#region 配置文件讀寫操作類
/// <summary>
/// 配置文件讀寫操作類
/// </summary>
/// <date>2012-02-15</date>
/// <author>xucj</author>
public class IniFileHelper
{
#region 字段
private string path;
#endregion
#region 構造函數
public IniFileHelper(string iniFilePath)
{
path = iniFilePath;
}
#endregion
#region 引用外部庫
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);
#endregion
#region 寫入INI文件
/// <summary>
/// 寫入INI文件
/// </summary>
/// <param name="section">段名</param>
/// <param name="key">鍵名</param>
/// <param name="value">鍵值</param>
public void WriteValue(string section, string key, string value)
{
WritePrivateProfileString(section, key, value, this.path);
}
#endregion
#region 刪除ini配置
/// <summary>
/// 刪除ini文件下所有段落
/// </summary>
public void ClearAllSection()
{
WriteValue(null, null, null);
}
/// <summary>
/// 刪除ini文件下personal段落下的所有鍵
/// </summary>
/// <param name="Section"></param>
public void ClearSection(string Section)
{
WriteValue(Section, null, null);
}
#endregion
#region 讀取INI文件
/// <summary>
/// 讀取INI文件
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <returns></returns>
public string ReadValue(string section, string key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(section, key, "", temp, 255, this.path);
return temp.ToString();
}
private byte[] ReadValues(string section, string key)
{
byte[] temp = new byte[255];
int i = GetPrivateProfileString(section, key, "", temp, 255, this.path);
return temp;
}
/// <summary>
/// 讀取ini文件的所有段落名
/// </summary>
private string[] ReadValues()
{
byte[] allSection = ReadValues(null, null);
return ByteToString(allSection);
}
/// <summary>
/// 轉換byte[]類型為string[]數組類型
/// </summary>
/// <param name="sectionByte"></param>
/// <returns></returns>
private string[] ByteToString(byte[] sectionByte)
{
ASCIIEncoding ascii = new ASCIIEncoding();
//編碼所有key的string類型
string sections = ascii.GetString(sectionByte);
//獲取key的數組
string[] sectionList = sections.Split(new char[1] { '\0' });
return sectionList;
}
/// <summary>
/// 讀取ini文件的某段落下所有鍵名
/// </summary>
private string[] ReadValues(string section)
{
byte[] sectionByte = ReadValues(section, null);
return ByteToString(sectionByte);
}
#endregion
#region 不使用API方法
private Dictionary<string, string> configInfo = new Dictionary<string,string>(); //* 存放Ini文件配制信息
public int Count { get { return configInfo.Count; } }
public string this[string key]
{
get
{
if (configInfo.ContainsKey(key))
{
return configInfo[key].ToString();
}
else
{
return "No this key-value";
}
}
}
/// <summary>
/// 讀取指定INI文件中的配置信息
/// </summary>
/// <param name="file">配置文件的完整路徑名</param>
/// <param name="section">配置文件中的節名 "[" + section + "]"形式</param>
public IniFileHelper(string file, string section)
{
string Section = "[" + section + "]";
LoadIniFile(file, Section);
}
/// <summary>
/// 讀取ini文件,以HashTable的格式存放
/// </summary>
/// <param name="filePath">ini文件路徑</param>
/// <param name="section">ini讀取的段名</param>
private void LoadIniFile(string filePath, string section)
{
try
{
StreamReader sr = new StreamReader(filePath, System.Text.Encoding.Default);
string readLine = null;
bool IsReadEnd = false;
string[] keys;
while ((readLine = sr.ReadLine()) != null)
{
if (readLine == section)
{
while ((readLine = sr.ReadLine()) != null)
{
if(readLine != "")
{
if (readLine.Substring(0, 1) == "[")
{
IsReadEnd = true;
break;
}
keys = readLine.Split('=');
configInfo[keys[0].Trim()] = keys[1];
}
}
}
if (IsReadEnd)
{
break;
}
}
sr.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
configInfo.Clear();
}
}
#endregion
}
#endregion
3.序列化
這個主要是可序列化字典:
/// <summary>
/// 支持XML序列化的泛型Dictionary類
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
[XmlRoot("Dictionary")]
[Serializable()]
public class SerializableDictionary<TKey, TValue>
: Dictionary<TKey, TValue>, IXmlSerializable
{
#region
public SerializableDictionary()
: base()
{
}
public SerializableDictionary(IDictionary<TKey, TValue> dictionary)
: base(dictionary)
{
}
public SerializableDictionary(IEqualityComparer<TKey> comparer)
: base(comparer)
{
}
public SerializableDictionary(int capacity)
: base(capacity)
{
}
public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
: base(capacity, comparer)
{
}
protected SerializableDictionary(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#endregion
public XmlSchema GetSchema()
{
throw new NotImplementedException();
}
/**/
/// <summary>
/// 從對象的XML表示形式生成該對象
/// </summary>
/// <param name="reader"></param>
public void ReadXml(XmlReader reader)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
bool wasEmpty = reader.IsEmptyElement;
reader.Read();
if (wasEmpty)
return;
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.ReadStartElement("Key");
TKey key = (TKey)keySerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("Value");
TValue value = (TValue)valueSerializer.Deserialize(reader);
reader.ReadEndElement();
this.Add(key, value);
reader.MoveToContent();
}
reader.ReadEndElement();
}
/// <summary>
/// 將對象轉換為其XML表示形式
/// </summary>
/// <param name="writer"></param>
public void WriteXml(XmlWriter writer)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
foreach (TKey key in this.Keys)
{
writer.WriteStartElement("Key");
keySerializer.Serialize(writer, key);
writer.WriteEndElement();
writer.WriteStartElement("Value");
TValue value = this[key];
valueSerializer.Serialize(writer, value);
writer.WriteEndElement();
}
}
}
4.字符串
平時用的最多的肯定是字符串了,所以肯定也少了它:
using System;
using System.Collections.Generic;
using System.Text;
public static class StringHelper
{
/// <summary>
/// 將字符串轉換為base64編碼數據
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ToBase64String(this string str)
{
byte[] data = System.Text.ASCIIEncoding.ASCII.GetBytes(str);
return Convert.ToBase64String(data);
}
/// <summary>
/// 將base64編碼數據轉換為字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string FromBase64String(this string str)
{
byte[] data = Convert.FromBase64String(str);
return System.Text.ASCIIEncoding.ASCII.GetString(data);
}
}
5.漢轉英
在系統檢索菜品時,要根據拼音,所以這個也不能少,當然這個也有其他的方法,像存儲過程或依靠數據庫表都可以,下面是純C#代碼的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class GetPinYinHelper
{
/// <summary>
/// 獲取拼音首字母
/// </summary>
/// <param name="strCharacter">要轉換的中文漢字字符串</param>
/// <returns>拼音縮寫</returns>
/// <author>xucj</author>
/// <date>2011-10-15</date>
public static string GetInitialPinYin(string strCharacter)
{
string tempStr = string.Empty;
foreach (char c in strCharacter)
{
if ((int)c >= 33 && (int)c <= 126 || (int)c == 32)
{
tempStr += c.ToString(); //字母和符號原樣保留、同時空格也保留。
}
else
{
tempStr += GetPYChar(c.ToString()); //累加拼音聲母
}
}
return tempStr;
}
/// <summary>
/// 取單個字符的拼音聲母
/// </summary>
/// <param name="character">要轉換的單個漢字</param>
/// <returns>拼音聲母</returns>
/// <author>xucj</author>
/// <date>2011-10-15</date>
private static string GetPYChar(string character)
{
byte[] array = new byte[2];
array = System.Text.Encoding.Default.GetBytes(character);
int i = (short)(array[0] - '\0') * 256 + ((short)(array[1] - '\0'));
if (i < 0xB0A1) return "*";
if (i < 0xB0C5) return "a";
if (i < 0xB2C1) return "b";
if (i < 0xB4EE) return "c";
if (i < 0xB6EA) return "d";
if (i < 0xB7A2) return "e";
if (i < 0xB8C1) return "f";
if (i < 0xB9FE) return "g";
if (i < 0xBBF7) return "h";
if (i < 0xBFA6) return "j";
if (i < 0xC0AC) return "k";
if (i < 0xC2E8) return "l";
if (i < 0xC4C3) return "m";
if (i < 0xC5B6) return "n";
if (i < 0xC5BE) return "o";
if (i < 0xC6DA) return "p";
if (i < 0xC8BB) return "q";
if (i < 0xC8F6) return "r";
if (i < 0xCBFA) return "s";
if (i < 0xCDDA) return "t";
if (i < 0xCEF4) return "w";
if (i < 0xD1B9) return "x";
if (i < 0xD4D1) return "y";
if (i < 0xD7FA) return "z";
return "*";
}
}
再加一個獲取本機的IP與機器名與MAC地址的方法:
using System.Management;
using System.Net;
public class NetHelper
{
/// <summary>
/// 取得本機IP
/// </summary>
public static string GetIP()
{
string hostName = Dns.GetHostName();
IPHostEntry ipEntry = Dns.GetHostEntry(hostName);
IPAddress[] addr = ipEntry.AddressList;
foreach (var item in addr)
{
if (item.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
{
continue;
}
return item.ToString();
}
return null;
}
/// <summary>
/// 獲取本機MAC地址
/// </summary>
/// <returns></returns>
public static string GetLocalMACAddress()
{
string mac = string.Empty;
ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration");
ManagementObjectCollection queryCollection = query.Get();
foreach (ManagementObject mo in queryCollection)
{
if (mo["IPEnabled"].ToString() == "True")
mac = mo["MacAddress"].ToString();
}
return mac;
}
/// <summary>
/// 獲取本機名
/// </summary>
/// <returns></returns>
public static string GetHostName()
{
string hostName = Dns.GetHostName();
return hostName;
}
}
當然還有很多,等後面需要再慢慢加上來,不相關的就不要了,那樣肯定會太雜的,雖然有一些很好很優雅的公共代碼,但是如果系統用不上,那也浪費了,那就讓它保存在備用庫裡吧。這些代碼來源還是廣泛的,所以沒有太多好寫的,下次寫數據庫訪問模塊了。主要實現ORM這個功能,因為通用數據庫訪問模塊網絡上也是很多的,時間上應該不會占用太多時間,但是用ORM的話還是能夠減少寫SQL語句的時間,所以寫一個帶ORM功能的數據庫訪問模塊。能不用寫SQL的地方就靠它了。
當然還有其他代碼,就不貼這裡了,有需要的就mark下,沒人mark的話就...........