|
Posted on 2009-03-04 10:47 泰仔在線 閱讀(509) 評論(0) 編輯 收藏 所屬分類: .NET相關
using System;
using System.Collections.Generic;
using System.Text;

namespace Test.Modules
  {
public abstract class CustomIniFile
 {
public CustomIniFile(string AFileName)
 {
FFileName = AFileName;
}
private string FFileName;
public string FileName
 {
 get { return FFileName; }
}
public virtual bool SectionExists(string Section)
 {
List<string> vStrings = new List<string>();
ReadSections(vStrings);
return vStrings.Contains(Section);
}
public virtual bool ValueExists(string Section, string Ident)
 {
List<string> vStrings = new List<string>();
ReadSection(Section, vStrings);
return vStrings.Contains(Ident);
}
public abstract string ReadString(string Section, string Ident, string Default);
public abstract bool WriteString(string Section, string Ident, string Value);
public abstract bool ReadSectionValues(string Section, List<string> Strings);
public abstract bool ReadSection(string Section, List<string> Strings);
public abstract bool ReadSections(List<string> Strings);
public abstract bool EraseSection(string Section);
public abstract bool DeleteKey(string Section, string Ident);
public abstract bool UpdateFile();
}
 /**//// <summary>
/// 存儲本地INI文件的類。
/// </summary>
public class IniFile : CustomIniFile
 {
[DllImport("kernel32")]
private static extern uint GetPrivateProfileString(
string lpAppName, // points to section name
string lpKeyName, // points to key name
string lpDefault, // points to default string
byte[] lpReturnedString, // points to destination buffer
uint nSize, // size of destination buffer
string lpFileName // points to initialization filename
);
[DllImport("kernel32")]
private static extern bool WritePrivateProfileString(
string lpAppName, // pointer to section name
string lpKeyName, // pointer to key name
string lpString, // pointer to string to add
string lpFileName // pointer to initialization filename
);
 /**//// <summary>
/// 構造IniFile實例。
/// <param name="AFileName">指定文件名</param>
/// </summary>
public IniFile(string AFileName)
: base(AFileName)
 {
}
 /**//// <summary>
/// 析夠IniFile實例。
/// </summary>
~IniFile()
 {
UpdateFile();
}
 /**//// <summary>
/// 讀取字符串值。
/// <param name="Ident">指定變量標識。</param>
/// <param name="Section">指定所在區域。</param>
/// <param name="Default">指定默認值。</param>
/// <returns>返回讀取的字符串。如果讀取失敗則返回該值。</returns>
/// </summary>
public override string ReadString(string Section, string Ident, string Default)
 {
byte[] vBuffer = new byte[2048];
uint vCount = GetPrivateProfileString(Section,
Ident, Default, vBuffer, (uint)vBuffer.Length, FileName);
return Encoding.Default.GetString(vBuffer, 0, (int)vCount);
}
 /**//// <summary>
/// 寫入字符串值。
/// </summary>
/// <param name="Section">指定所在區域。</param>
/// <param name="Ident">指定變量標識。</param>
/// <param name="Value">所要寫入的變量值。</param>
/// <returns>返回寫入是否成功。</returns>
public override bool WriteString(string Section, string Ident, string Value)
 {
return WritePrivateProfileString(Section, Ident, Value, FileName);
}
 /**//// <summary>
/// 獲得區域的完整文本。(變量名=值格式)。
/// </summary>
/// <param name="Section">指定區域標識。</param>
/// <param name="Strings">輸出處理結果。</param>
/// <returns>返回讀取是否成功。</returns>
public override bool ReadSectionValues(string Section, List<string> Strings)
 {
List<string> vIdentList = new List<string>();
if (!ReadSection(Section, vIdentList)) return false;
foreach (string vIdent in vIdentList)
Strings.Add(string.Format("{0}={1}", vIdent, ReadString(Section, vIdent, "")));
return true;
}
 /**//// <summary>
/// 讀取區域變量名列表。
/// </summary>
/// <param name="Section">指定區域名。</param>
/// <param name="Strings">指定輸出列表。</param>
/// <returns>返回獲取是否成功。</returns>
public override bool ReadSection(string Section, List<string> Strings)
 {
byte[] vBuffer = new byte[16384];
uint vLength = GetPrivateProfileString(Section, null, null, vBuffer,
(uint)vBuffer.Length, FileName);
int j = 0;
for (int i = 0; i < vLength; i++)
if (vBuffer[i] == 0)
 {
Strings.Add(Encoding.Default.GetString(vBuffer, j, i - j));
j = i + 1;
}
return true;
}
 /**//// <summary>
/// 讀取區域名列表。
/// </summary>
/// <param name="Strings">指定輸出列表。</param>
/// <returns></returns>
public override bool ReadSections(List<string> Strings)
 {
byte[] vBuffer = new byte[16384];
uint vLength = GetPrivateProfileString(null, null, null, vBuffer,
(uint)vBuffer.Length, FileName);
int j = 0;
for (int i = 0; i < vLength; i++)
if (vBuffer[i] == 0)
 {
Strings.Add(Encoding.Default.GetString(vBuffer, j, i - j));
j = i + 1;
}
return true;
}
 /**//// <summary>
/// 刪除指定區域。
/// </summary>
/// <param name="Section">指定區域名。</param>
/// <returns>返回刪除是否成功。</returns>
public override bool EraseSection(string Section)
 {
return WritePrivateProfileString(Section, null, null, FileName);
}
 /**//// <summary>
/// 刪除指定變量。
/// </summary>
/// <param name="Section">變量所在區域。</param>
/// <param name="Ident">變量標識。</param>
/// <returns>返回刪除是否成功。</returns>
public override bool DeleteKey(string Section, string Ident)
 {
return WritePrivateProfileString(Section, Ident, null, FileName);
}
 /**//// <summary>
/// 更新文件。
/// </summary>
/// <returns>返回更新是否成功。</returns>
public override bool UpdateFile()
 {
return WritePrivateProfileString(null, null, null, FileName);
}
}
}
轉自: C#中處理INI文件的類
|