INI配置文件读写工具类
来源:互联网 发布:手机视频格式转换软件 编辑:程序博客网 时间:2024/03/28 23:04
INI配置文件读写工具类
using System;using System.Collections.Generic;using System.Text;using System.Collections;using System.IO;namespace Yong.CommonLib{ /// <summary> /// ini 配置文件读写 /// TODO:应该使用“单例”来创建实例,以提高效率 /// TODO:考虑使用Nini或Win32 api调用实现,好处:稳定代码,速度更快 /// Nini还可以读取配置文件和注册表 /// </summary> public class CIni { private StreamReader aStreamReader; private StreamWriter aStreamWriter; private ArrayList aSegList = new ArrayList(); public string strLastError = "没有错误"; private string strRoot = ""; private string strKey = ""; struct StructSeg { public string strSeg; public ArrayList ItemValue; public StructSeg(string strSeg) { this.strSeg = strSeg; ItemValue = new ArrayList(); } } /// <summary> /// </summary> public CIni() { // // TODO: 在此处添加构造函数逻辑 // } /// <summary> /// TODO:使用map优化! /// </summary> /// <returns></returns> public int SetCrypto(string strSetKey) { byte[] aBytes = Encoding.GetEncoding("gb2312").GetBytes(strSetKey); if (aBytes.Length != 8 && aBytes.Length != 16) { strLastError = "密钥长度错误"; return -1; } this.strKey = strSetKey; return 0; } public int SetRoot(string strSetRoot) { strSetRoot = strSetRoot.Trim(); if (strSetRoot != "") { this.strRoot = strSetRoot + "\\"; } else { this.strRoot = ""; } return 0; } /// <summary> /// 获取所有段中同名的项目的值 /// </summary> /// <returns></returns> public ArrayList getAllSegName() { ArrayList al = new ArrayList(); foreach (StructSeg aSeg in aSegList) { al.Add(trimBracket(aSeg.strSeg)); } return al; } private string trimBracket(string source) { int begin = source.IndexOf('['); int end = source.IndexOf(']'); if (begin >= end || begin < 0 || end < 0) { return source; } return source.Substring(begin + 1, end - begin - 1); } public int LoadFromString(string strContent) { try { byte[] byteContent = Encoding.GetEncoding("gb2312").GetBytes(strContent); return LoadFromBytes(byteContent); } catch (Exception e) { strLastError = "加载失败,系统提示:" + e.Message; return (-1); } finally { try { aStreamReader.Close(); } catch { } } } public int LoadFromBytes(byte[] byteContent) { try { MemoryStream stream = new MemoryStream(); stream.Write(byteContent, 0, byteContent.Length); stream.Flush(); stream.Position = 0; aStreamReader = new StreamReader(stream, Encoding.GetEncoding("gb2312")); return Load(); } catch (Exception e) { strLastError = "加载失败,系统提示:" + e.Message; return (-1); } finally { try { aStreamReader.Close(); } catch { } } } private int Load() { try { aSegList = new ArrayList(); string strHead; string aLine; StructSeg aSeg = new StructSeg("[]"); while ((aLine = aStreamReader.ReadLine()) != null) { aLine = aLine.Trim().TrimEnd(new char[] { '\0' }); if (aLine.Length > 0) { strHead = aLine.Substring(0, 1); } else { continue; } if (strHead == "[") { aSegList.Add(aSeg); aSeg = new StructSeg(aLine); } else { aSeg.ItemValue.Add(aLine); } } aSegList.Add(aSeg); return 0; } catch (Exception e) { strLastError = "加载失败,系统提示:" + e.Message; return (-1); } } public int Load(string strFileName) { ClassCrypto aClassCrypto = null; try { if (strKey != "") { aClassCrypto = new ClassCrypto(strKey); if (aClassCrypto.GetCryptoStreamReader(strFileName) < 0) { strLastError = aClassCrypto.strLastError; return -1; } aStreamReader = aClassCrypto.aReader; } else { aStreamReader = new StreamReader(strFileName, Encoding.GetEncoding("gb2312"), true); } return Load(); } catch (Exception e) { strLastError = "加载失败,系统提示:" + e.Message; return (-1); } finally { try { if (strKey != "") { aClassCrypto.CloseReader(); } else { aStreamReader.Close(); } } catch { } } } public int PushToString(out string strContent) { strContent = null; try { byte[] byteContent = null; if (PushToBytes(out byteContent) < 0) { return -1; } strContent = Encoding.GetEncoding("gb2312").GetString(byteContent, 0, byteContent.Length).Trim(new char[] { '\0' }); return 0; } catch (Exception e) { strLastError = "输出失败,系统提示:" + e.Message; return (-1); } } public int PushToBytes(out byte[] byteContent) { byteContent = null; try { MemoryStream stream = new MemoryStream(); aStreamWriter = new StreamWriter(stream, Encoding.GetEncoding("gb2312")); Push(); byteContent = stream.ToArray(); return 0; } catch (Exception e) { strLastError = "输出失败,系统提示:" + e.Message; return (-1); } finally { try { aStreamWriter.Close(); } catch { } } } public int Push(string strFileName) { ClassCrypto aClassCrypto = null; try { if (strKey != "") { aClassCrypto = new ClassCrypto(strKey); if (aClassCrypto.GetCryptoStreamWriter(strFileName) < 0) { strLastError = aClassCrypto.strLastError; return -1; } aStreamWriter = aClassCrypto.aWriter; } else { aStreamWriter = new StreamWriter(strFileName, false, Encoding.GetEncoding("gb2312")); } return Push(); } catch (Exception e) { strLastError = "写文件失败,系统提示:" + e.Message; return (-1); } finally { if (strKey != "") { aClassCrypto.CloseWriter(); } else { aStreamWriter.Close(); } } } private int Push() { try { foreach (StructSeg aSeg in aSegList) { if (aSeg.strSeg != "[]") aStreamWriter.WriteLine(aSeg.strSeg); //System.Windows.Forms.MessageBox.Show(aSeg.strSeg); foreach (string aLine in aSeg.ItemValue) { //System.Windows.Forms.MessageBox.Show(aLine); aStreamWriter.WriteLine(aLine); } } aStreamWriter.Flush(); return 0; } catch (Exception e) { strLastError = "输出失败,系统提示:" + e.Message; return (-1); } } public int GetIniItem(string strSeg, string strItem, out string strValue) { strSeg = "[" + strRoot + strSeg.Trim() + "]"; strValue = ""; try { foreach (StructSeg aSeg in aSegList) { if (GetSeg(aSeg.strSeg).ToUpper() == strSeg.ToUpper()) { foreach (string aLine in aSeg.ItemValue) { if (GetItem(aLine).ToUpper() == strItem.ToUpper()) { strValue = GetValue(aLine); return (0); } } } } strLastError = "未找到数据:" + strSeg + " " + strItem; return (-1); } catch (Exception e) { strLastError = "获取数据异常:" + strSeg + " " + strItem + " 系统提示:" + e.Message; return (-2); } } public int GetIniItemBlock(string strSeg, string strItem, out byte[] bytesValue) { strSeg = "[" + strRoot + strSeg.Trim() + "]"; bytesValue = new byte[0]; string strValue = ""; try { foreach (StructSeg aSeg in aSegList) { if (GetSeg(aSeg.strSeg).ToUpper() == strSeg.ToUpper()) { for (int i = 0; i < aSeg.ItemValue.Count; i++) { string aLine = (string)aSeg.ItemValue[i]; if (GetItem(aLine).ToUpper() == strItem.ToUpper()) { strValue = GetValue(aLine); if (strValue.EndsWith("-")) { strValue = strValue.Substring(0, strValue.Length - 1); for (int j = i + 1; j < aSeg.ItemValue.Count; j++) { aLine = (string)aSeg.ItemValue[j]; aLine = aLine.Trim(); if (!aLine.StartsWith(";-")) break; aLine = aLine.Substring(2); strValue += aLine; if (!strValue.EndsWith("-")) break; strValue = strValue.Substring(0, strValue.Length - 1); } } try { bytesValue = Convert.FromBase64String(strValue); } catch (Exception e) { strLastError = "数据处理异常:" + strSeg + " " + strItem + " 系统提示:" + e.Message; return (-1); } //if(HexToBytes(strValue,out bytesValue)!=0){ // return (-1); //} return (0); } } } } strLastError = "未找到数据:" + strSeg + " " + strItem; return (-1); } catch (Exception e) { strLastError = "获取数据异常:" + strSeg + " " + strItem + " 系统提示:" + e.Message; return (-2); } } public int GetIniItem(string strSeg, string strItem, out int iValue) { string strValue; iValue = 0; int iRetCode = GetIniItem(strSeg, strItem, out strValue); if (iRetCode < 0) return (iRetCode); try { iValue = Convert.ToInt32(strValue); } catch { } return (0); } public int GetIniItem(string strSeg, string strItem, out Single sValue) { string strValue; sValue = 0f; int iRetCode = GetIniItem(strSeg, strItem, out strValue); if (iRetCode < 0) return (iRetCode); try { sValue = Convert.ToSingle(strValue); } catch { } return (0); } public int GetIniItem(string strSeg, string strItem, out bool bValue) { string strValue; bValue = false; int iRetCode = GetIniItem(strSeg, strItem, out strValue); if (iRetCode < 0) return (iRetCode); if (strValue == "true" || strValue == "TRUE" || strValue == "True" || strValue == "是" || strValue == "yes" || strValue == "YES" || strValue == "Yes") { bValue = true; } else { bValue = false; } return (0); } public int GetIniItem(string strSeg, string strItem, out byte[] byetsValue) { string strValue; byetsValue = new byte[0]; int iRetCode = GetIniItem(strSeg, strItem, out strValue); if (iRetCode < 0) return (iRetCode); return (HexToBytes(strValue, out byetsValue)); } public int SetIniItem(string strSeg, string strItem, byte[] bytesValue) { return (SetIniItem(strSeg, strItem, bytesValue, "")); } public int SetIniItem(string strSeg, string strItem, byte[] bytesValue, string strDescription) { string strHex; int iRetCode = BytesToHex(out strHex, bytesValue); if (iRetCode < 0) return (iRetCode); return (SetIniItem(strSeg, strItem, strHex, strDescription)); } public int SetIniItem(string strSeg, string strItem, bool bValue) { return (SetIniItem(strSeg, strItem, bValue, "")); } public int SetIniItem(string strSeg, string strItem, bool bValue, string strDescription) { return (SetIniItem(strSeg, strItem, bValue.ToString(), strDescription)); } public int SetIniItem(string strSeg, string strItem, string strValue) { return (SetIniItem(strSeg, strItem, strValue, "")); } public int SetIniItem(string strSeg, string strItem, string strValue, string strDescription) { strSeg = "[" + strRoot + strSeg.Trim() + "]"; strValue = CheckValue(strValue); string aNewLine = strItem + "\t=\t" + strValue; StructSeg aSeg; int i, j; string aLine; try { for (i = 0; i < aSegList.Count; i++) { aSeg = (StructSeg)aSegList[i]; if (GetSeg(aSeg.strSeg).ToUpper() == strSeg.ToUpper()) { for (j = 0; j < aSeg.ItemValue.Count; j++) { aLine = (string)aSeg.ItemValue[j]; if (GetItem(aLine).ToUpper() == strItem.ToUpper()) { if (strDescription != "") { aNewLine = aNewLine + "\t;" + strDescription; } else if (GetDescription(aLine) != "") { aNewLine = aNewLine + "\t;" + GetDescription(aLine); } aSeg.ItemValue[j] = aNewLine; aSegList[i] = aSeg; return (0); } } if (strDescription != "") aNewLine = aNewLine + "\t;" + strDescription; aSeg.ItemValue.Add(aNewLine); aSegList[i] = aSeg; return (0); } } aSeg = new StructSeg(strSeg); if (strDescription != "") aNewLine = aNewLine + "\t;" + strDescription; aSeg.ItemValue.Add(aNewLine); aSegList.Add(aSeg); return (0); } catch (Exception e) { strLastError = "设置数据异常:" + strSeg + " " + strItem + " 系统提示:" + e.Message; return (-2); } } public int SetIniItemBlock(string strSeg, string strItem, byte[] bytesValue) { strSeg = "[" + strRoot + strSeg.Trim() + "]"; string strValue; string[] strArray = new string[0]; //if (BytesToHex(out strValue, bytesValue) != 0) return -1; try { strValue = Convert.ToBase64String(bytesValue); } catch (Exception e) { strLastError = "数据处理异常:" + strSeg + " " + strItem + " 系统提示:" + e.Message; return -1; } string aNewLine = strItem + "\t=\t-"; int i, j; i = (strValue.Length + 63) / 64; if (i > 0) { strArray = new string[i]; for (j = 0; j < (i - 1); j++) { strArray[j] = ";-" + strValue.Substring(j * 64, 64) + "-"; } strArray[i - 1] = ";-" + strValue.Substring((i - 1) * 64); } StructSeg aSeg; string aLine; try { for (i = 0; i < aSegList.Count; i++) { aSeg = (StructSeg)aSegList[i]; if (GetSeg(aSeg.strSeg).ToUpper() == strSeg.ToUpper()) { for (j = 0; j < aSeg.ItemValue.Count; j++) { aLine = (string)aSeg.ItemValue[j]; if (GetItem(aLine).ToUpper() == strItem.ToUpper()) { aSeg.ItemValue[j] = aNewLine; for (int k = j + 1; k < aSeg.ItemValue.Count; k++) { aLine = (string)aSeg.ItemValue[k]; aLine = aLine.Trim(); if (aLine.StartsWith(";-")) { aSeg.ItemValue.RemoveAt(k); k--; continue; } } for (int k = 0; k < strArray.Length; k++) { aSeg.ItemValue.Insert(j + k + 1, strArray[k]); } aSegList[i] = aSeg; return (0); } } aSeg.ItemValue.Add(aNewLine); for (int k = 0; k < strArray.Length; k++) { aSeg.ItemValue.Add(strArray[k]); } aSegList[i] = aSeg; return (0); } } aSeg = new StructSeg(strSeg); aSeg.ItemValue.Add(aNewLine); for (int k = 0; k < strArray.Length; k++) { aSeg.ItemValue.Add(strArray[k]); } aSegList[i] = aSeg; aSegList.Add(aSeg); return (0); } catch (Exception e) { strLastError = "设置数据异常:" + strSeg + " " + strItem + " 系统提示:" + e.Message; return (-2); } } public int RemoveIniItem(string strSeg, string strItem) { strSeg = "[" + strRoot + strSeg.Trim() + "]"; StructSeg aSeg; int i, j; string aLine; try { for (i = 0; i < aSegList.Count; i++) { aSeg = (StructSeg)aSegList[i]; if (GetSeg(aSeg.strSeg).ToUpper() == strSeg.ToUpper()) { for (j = 0; j < aSeg.ItemValue.Count; j++) { aLine = (string)aSeg.ItemValue[j]; if (GetItem(aLine).ToUpper() == strItem.ToUpper()) { aSeg.ItemValue.RemoveAt(j); aSegList[i] = aSeg; break; } } if (aSeg.ItemValue.Count <= 0) { aSegList.RemoveAt(i); } break; } } return (0); } catch (Exception e) { strLastError = "删除数据异常:" + strSeg + " " + strItem + " 系统提示:" + e.Message; return (-2); } } private string Clear(string aLine) { int iPos = 0; while ((iPos = aLine.IndexOf(';', iPos)) >= 0) { if (iPos == 0) break; if (aLine.Substring(iPos - 1, 1) != "\\") break; iPos++; } if (iPos >= 0) aLine = aLine.Substring(0, iPos); aLine = aLine.Trim(); return (aLine); } private string GetSeg(string aLine) { aLine = Clear(aLine); return (aLine); } private string GetItem(string aLine) { aLine = Clear(aLine); string[] strArray = aLine.Split("=".ToCharArray()); return (strArray[0].Trim()); } private string GetValue(string aLine) { aLine = Clear(aLine); int iPos = aLine.IndexOf("="); if (iPos >= 0 && iPos < (aLine.Length - 1)) { aLine = aLine.Substring(iPos + 1).Trim() + " "; iPos = 0; while ((iPos = aLine.IndexOf('\\', iPos)) >= 0) { switch (aLine.Substring(iPos + 1, 1)) { case "r": aLine = aLine.Substring(0, iPos) + "\r" + aLine.Substring(iPos + 2); break; case "n": aLine = aLine.Substring(0, iPos) + "\n" + aLine.Substring(iPos + 2); break; case "t": aLine = aLine.Substring(0, iPos) + "\t" + aLine.Substring(iPos + 2); break; default: aLine = aLine.Substring(0, iPos) + aLine.Substring(iPos + 1); break; } iPos += 1; } return (aLine.Trim()); } else { return (""); } } private string CheckValue(string strValue) { int iPos = 0; while ((iPos = strValue.IndexOf('\\', iPos)) >= 0) { strValue = strValue.Substring(0, iPos) + "\\" + strValue.Substring(iPos); iPos += 2; } iPos = 0; while ((iPos = strValue.IndexOf(';', iPos)) >= 0) { strValue = strValue.Substring(0, iPos) + "\\" + strValue.Substring(iPos); iPos += 2; } iPos = 0; while ((iPos = strValue.IndexOf('\r', iPos)) >= 0) { strValue = strValue.Substring(0, iPos) + "\\r" + strValue.Substring(iPos + 1); iPos += 3; if (iPos >= strValue.Length) break; } iPos = 0; while ((iPos = strValue.IndexOf('\n', iPos)) >= 0) { strValue = strValue.Substring(0, iPos) + "\\n" + strValue.Substring(iPos + 1); iPos += 3; if (iPos >= strValue.Length) break; } iPos = 0; while ((iPos = strValue.IndexOf('\t', iPos)) >= 0) { strValue = strValue.Substring(0, iPos) + "\\t" + strValue.Substring(iPos + 1); iPos += 3; if (iPos >= strValue.Length) break; } return (strValue); } private string GetDescription(string aLine) { int iPos = 0; while ((iPos = aLine.IndexOf(';', iPos)) >= 0) { if (iPos == 0) break; if (aLine.Substring(iPos - 1, 1) != "\\") break; iPos++; } if (iPos >= 0) { aLine = aLine.Substring(iPos + 1); } else { aLine = ""; } aLine = aLine.Trim(); return (aLine); } /// <summary> /// TODO:应该放在公共库中 /// </summary> /// <param name="strHex"></param> /// <param name="aBytes"></param> /// <returns></returns> public int HexToBytes(string strHex, out byte[] aBytes) { strHex = strHex.ToUpper(); char[] tmpCharArray = strHex.ToCharArray(); aBytes = new byte[0]; if ((tmpCharArray.Length % 2) != 0) { strLastError = "HEX数据长度错误"; return (-1); } aBytes = new byte[tmpCharArray.Length / 2]; for (int i = 0; i < tmpCharArray.Length; i += 2) { if (tmpCharArray[i] >= 'A' && tmpCharArray[i] <= 'F') { aBytes[i / 2] = (byte)((tmpCharArray[i] - 'A' + 10) * 16); } else if (tmpCharArray[i] >= '0' && tmpCharArray[i] <= '9') { aBytes[i / 2] = (byte)((tmpCharArray[i] - '0') * 16); } else { strLastError = "HEX数据中有非法字符"; return (-1); } if (tmpCharArray[i + 1] >= 'A' && tmpCharArray[i + 1] <= 'F') { aBytes[i / 2] += (byte)((tmpCharArray[i + 1] - 'A' + 10)); } else if (tmpCharArray[i + 1] >= '0' && tmpCharArray[i + 1] <= '9') { aBytes[i / 2] += (byte)((tmpCharArray[i + 1] - '0')); } else { strLastError = "HEX数据中有非法字符"; return (-1); } } return (0); } /// <summary> /// TODO:应该放在公共库中 /// </summary> /// <param name="strHex"></param> /// <param name="aBytes"></param> /// <returns></returns> public int BytesToHex(out string strHex, byte[] aBytes) { strHex = ""; int iBlock = aBytes.Length / 16; int i, j; for (j = 0; j < iBlock; j++) { i = j * 16; strHex += String.Format("{0:X2}{1:X2}{2:X2}{3:X2}{4:X2}{5:X2}{6:X2}{7:X2}{8:X2}{9:X2}{10:X2}{11:X2}{12:X2}{13:X2}{14:X2}{15:X2}", aBytes[i], aBytes[i + 1], aBytes[i + 2], aBytes[i + 3], aBytes[i + 4], aBytes[i + 5], aBytes[i + 6], aBytes[i + 7], aBytes[i + 8], aBytes[i + 9], aBytes[i + 10], aBytes[i + 11], aBytes[i + 12], aBytes[i + 13], aBytes[i + 14], aBytes[i + 15]); } for (i = iBlock * 16; i < aBytes.Length; i++) { strHex += String.Format("{0:X2}", aBytes[i]); } return (0); } }}
ClassCryptole类:
using System;using System.Collections.Generic;using System.Text;using System.Security.Cryptography;using System.IO;namespace Yong.CommonLib{ public class ClassCrypto { private string strKey = "12345678"; public StreamReader aReader; public StreamWriter aWriter; private FileStream aFileStreamRead; private FileStream aFileStreamWrite; private CryptoStream aCryptoStreamRead; private CryptoStream aCryptoStreamWrite; private DESCryptoServiceProvider aDes; public string strLastError = ""; public ClassCrypto() { aDes = new DESCryptoServiceProvider(); aDes.Key = Encoding.ASCII.GetBytes(strKey); aDes.IV = Encoding.ASCII.GetBytes(strKey); } public ClassCrypto(string _strKey) { strKey = _strKey; aDes = new DESCryptoServiceProvider(); aDes.Key = Encoding.ASCII.GetBytes(strKey); aDes.IV = Encoding.ASCII.GetBytes(strKey); } public int GetCryptoStreamReader(string strFileName) { return GetCryptoStreamReader(strFileName, Encoding.Default); } public int GetCryptoStreamReader(string strFileName, Encoding aEncoding) { try { ICryptoTransform desencrypt = aDes.CreateDecryptor(); aFileStreamRead = new FileStream(strFileName, FileMode.Open); aCryptoStreamRead = new CryptoStream(aFileStreamRead, desencrypt, CryptoStreamMode.Read); aReader = new StreamReader(aCryptoStreamRead, aEncoding, true); return 0; } catch (Exception e) { strLastError = "在打开文件" + strFileName + "时发生异常" + e.Message; return -1; } } public int GetCryptoStreamReader(string strFileName, Encoding aEncoding, int bufferSize) { try { ICryptoTransform desencrypt = aDes.CreateDecryptor(); aFileStreamRead = new FileStream(strFileName, FileMode.Open); aCryptoStreamRead = new CryptoStream(aFileStreamRead, desencrypt, CryptoStreamMode.Read); aReader = new StreamReader(aCryptoStreamRead, aEncoding, true, bufferSize); return 0; } catch (Exception e) { strLastError = "在打开文件" + strFileName + "时发生异常" + e.Message; return -1; } } public int GetCryptoStreamWriter(string strFileName) { return GetCryptoStreamWriter(strFileName, false, Encoding.Default); } public int GetCryptoStreamWriter(string strFileName, bool append, Encoding aEncoding) { try { ICryptoTransform desencrypt = aDes.CreateEncryptor(); if (append) { aFileStreamWrite = new FileStream(strFileName, FileMode.Append); } else { aFileStreamWrite = new FileStream(strFileName, FileMode.Create); } aCryptoStreamWrite = new CryptoStream(aFileStreamWrite, desencrypt, CryptoStreamMode.Write); aWriter = new StreamWriter(aCryptoStreamWrite, aEncoding); return 0; } catch (Exception e) { strLastError = "在打开文件" + strFileName + "时发生异常" + e.Message; return -1; } } public int CloseWriter() { try { aWriter.Close(); } catch { } try { aCryptoStreamWrite.Close(); } catch { } try { aFileStreamWrite.Close(); } catch (Exception e) { strLastError = "在关闭输出文件时发生异常:" + e.Message; return -1; } return 0; } public int CloseReader() { try { aReader.Close(); } catch { } try { aCryptoStreamRead.Close(); } catch { } try { aFileStreamRead.Close(); } catch (Exception e) { strLastError = "在关闭输入文件时发生异常:" + e.Message; return -1; } return 0; } }}
0 0
- INI配置文件读写工具类
- 【工具类】-ini配置文件读写操作类
- 读写INI配置文件的Java类
- 用于读写 INI 配置文件的 C++ 类
- ini配置文件读写
- 读写配置文件 ini
- C#读写INI配置文件
- C++读写ini配置文件
- VC++读写INI配置文件
- C#读写ini配置文件
- C++读写ini配置文件
- C#读写ini配置文件
- C#读写ini配置文件
- C#读写INI配置文件
- INI配置文件读写
- 读写配置文件(.ini)
- VC ini配置文件读写
- python 读写 .ini 配置文件
- unity中把材质截图当材质的matcap材质
- 《Java---Socket二进制通讯读取一行》
- (四)PHP注释,运算符
- 纯干货,Spring-data-jpa详解,全方位介绍。
- MFC ComBox 控件 调节下拉大小
- INI配置文件读写工具类
- ipv6网段 防火墙 转发功能分析
- mysql sql查询
- MongoDB基本操作
- Xcode import CocoaPods 中的第三方库时不提示
- qt中,如何用QLabel显示一个变量!
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
- 有关css清空样式比较全的总结
- 代码重构和优化一