1. 程式人生 > >C# 操作INI檔案類

C# 操作INI檔案類

    //補充:        //using System;     //using System.Runtime.InteropServices;     //using System.Text;     //using System.Collections;     //using System.Collections.Specialized;      //namespace wuyisky     //{     /**/     /**/     /**/     ///      /// IniFiles的類     ///      public class IniFiles     {         public string FileName;         //INI檔名         //宣告讀寫INI檔案的API函式         [DllImport("kernel32")] private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath);         [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);

        //類的建構函式,傳遞INI檔名         public IniFiles(string AFileName)         {             // 判斷檔案是否存在             FileInfo fileInfo = new FileInfo(AFileName);             //Todo:搞清列舉的用法             if ((!fileInfo.Exists))             {                 //|| (FileAttributes.Directory in fileInfo.Attributes))                 //檔案不存在,建立檔案                 System.IO.StreamWriter sw = new System.IO.StreamWriter(AFileName, false, System.Text.Encoding.Default);                 try                 {                     sw.Write("#表格配置檔案");                     sw.Close();                 }                  catch                 {                     throw (new ApplicationException("Ini檔案不存在"));                 }             }             //必須是完全路徑,不能是相對路徑             FileName = fileInfo.FullName;         }                 //寫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的所有Value到列表中,         //public void ReadSectionValues(string Section, NameValueCollection Values,char splitString)         //{ string sectionValue;         // string[] sectionValueSplit;         // StringCollection KeyList = new StringCollection();         // ReadSection(Section, KeyList);         // Values.Clear();         // foreach (string key in KeyList)         // {         // sectionValue=ReadString(Section, key, "");         // sectionValueSplit=sectionValue.Split(splitString);         // Values.Add(key, sectionValueSplit[0].ToString(),sectionValueSplit[1].ToString());          // }         //}         //清除某個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; }          //確保資源的釋放 ~IniFiles() { UpdateFile(); } } }  }

    /// <summary>     ///Class2 的摘要說明     /// </summary>     public class Class2     {   //   //TODO: 在此處新增建構函式邏輯   //         [DllImport("kernel32.dll")]         private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);         [DllImport("kernel32.dll")]         private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);           public Class2()      {}         /// <summary>         /// 寫入INI檔案         /// </summary>         /// <param name=^Section^>節點名稱</param>         /// <param name=^Key^>關鍵字</param>         /// <param name=^Value^>值</param>         /// <param name=^filepath^>INI檔案路徑</param>         static public void IniWriteValue(string Section, string Key, string Value, string filepath)         { WritePrivateProfileString(Section, Key, Value, filepath); }              /// <summary>         /// 讀取INI檔案         /// </summary>         /// <param name=^Section^>節點名稱</param>         /// <param name=^Key^>關鍵字</param>         /// <param name=^filepath^>INI檔案路徑</param>         /// <returns>值</returns>         static public string IniReadValue(string Section, string Key, string filepath)         {             StringBuilder temp = new StringBuilder(255);             int i = GetPrivateProfileString(Section, Key, "", temp,255, filepath);             return temp.ToString();         }      }     //ini 文件格式路徑假設為 D:/SETUP.ini  [SQL]  SVRName=192.168.1.11\SQL2005  讀取例項      //    IniReadValue("SQL", "SVRName"," D:/SETUP.ini");  這樣讀取出來的值是192.168.1.11\SQL2005  寫的話類似     //    IniReadValue("SQL", "SVRName","你要寫入的值"," D:/SETUP.ini");