110,539
社区成员
发帖
与我相关
我的任务
分享
//从Ini文件中,将指定的Section名称中的所有Ident添加到列表中
public StringCollection ReadSection(string Section)
{
Byte[] Buffer = new Byte[16384];
StringCollection Idents = new StringCollection();
//Idents.Clear();
int bufLen = GetPrivateProfileString(Section, null, null, Buffer, Buffer.GetUpperBound(0),
FileName);
//对Section进行解析
GetStringsFromBuffer(Buffer, bufLen, Idents);
return 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 StringCollection ReadSections()
{
StringCollection SectionList = new StringCollection();
//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);
return SectionList;
}
//读取指定的Section的所有Value到列表中
public NameValueCollection ReadSectionValues(string Section)
{
NameValueCollection Values = new NameValueCollection();
StringCollection KeyList = ReadSection(Section);
Values.Clear();
foreach (string key in KeyList)
{
Values.Add(key, ReadString(Section, key, ""));
}
return Values;
}
//清除某个Section
public void EraseSection(string Section)
{
//
if (!WritePrivateProfileString(Section, null, null, FileName))
{
throw (new ApplicationException("无法清除Ini文件中的Section"));
}
}
//删除某个Section下的键
public void DeleteSectionKey(string Section, string Ident)
{
WritePrivateProfileString(Section, Ident, null, FileName);
}
/// <summary>
/// Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件
/// </summary>
///Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件
///在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile
///执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。
public void UpdateFile()
{
WritePrivateProfileString(null, null, null, FileName);
}
/// <summary>
/// 检查某个Section是否存在。
/// </summary>
/// <param name="Section">小节名</param>
/// <returns>存在返回true,否则为false。</returns>
public bool SectionExists(string Section)
{
StringCollection Sections = this.ReadSections();
return Sections.IndexOf(Section) > -1;
}
/// <summary>
/// 检查某个Section的某个键值是否存在。
/// </summary>
/// <param name="Section">小节名</param>
/// <param name="Ident">关键字</param>
/// <returns>存在返回true,否则为false。</returns>
public bool ValueExists(string Section, string Ident)
{
//
StringCollection Idents = ReadSection(Section);
return Idents.IndexOf(Ident) > -1;
}
//确保资源的释放 */
~inifile()
{
UpdateFile();
}
}
}
然后,调用:
string SQLStr = ReadiniFile("Execute SQL", "SQLCMD", "");
有点疑问,你这个是INI文件么?
INI文件相同小节中,字段名称怎么可能会相同呢?
正常INI文件也应该这么写啊:
[Execute SQL1]
;;-------------------------------------------------------------------------------------
;; データベースの作成
;;-------------------------------------------------------------------------------------
Message = "データベースの作成をしています。(%DBName%)"
SQLCMD = /d %DBName% /i E:\InstallDatabase\00Database\%DBFolder%\*.sql
;;-------------------------------------------------------------------------------------
[Execute SQL2]
;; ログインユーザの作成
;;-------------------------------------------------------------------------------------
Message = "ログインユーザを作成しています。"
SQLCMD = /d master /i E:\InstallDatabase\99Configure\10_LoginUser\*.sql
;;-------------------------------------------------------------------------------------
[Execute SQL3]
;; データベースユーザの作成
;;-------------------------------------------------------------------------------------
Message = "データベースユーザを作成しています。"
SQLCMD = /d master /i E:\InstallDatabase\99Configure\20_DatabaseUser\*.sql
using System;
using System.Collections.Specialized;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using nv.lib.invlib;
namespace nv.lib.inifiles
{
/// <summary>
/// 使用建议:虽然支持中文,但建议在ini文件中尽量避免使用中文,以避免在不同的操作系统产生不可预料的错误。
/// 一个模仿Delphi的TIniFile的类
/// </summary>
public class inifile
{
public string FileName; //INI文件名
#region Dll Import
/// <summary>
/// 声明读写INI文件的API函数
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="val"></param>
/// <param name="filePath"></param>
/// <returns></returns>
[DllImport("kernel32.dll",EntryPoint="WritePrivateProfileString")]
private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString")]
private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);
#endregion
/// <summary>
/// 构造函数。
/// 当指定的INI文件不存在时可选是否建立或抛出异常。
/// </summary>
/// <param name="IniFileName">文件名</param>
/// <param name="ForceCreate">当文件不存在时是否建立</param>
public inifile(string IniFileName, bool ForceCreate)
{
// 判断文件是否存在
FileInfo fileInfo = new FileInfo(IniFileName);
if ((!fileInfo.Exists))
if (!ForceCreate)
{
throw (new ApplicationException("Ini文件不存在"));
}
else
{
fileInfo.Directory.Create();
fileInfo.Create();
}
//必须是完全路径,不能是相对路径
FileName = fileInfo.FullName;
}
#region 各种数据类型的读写
/// <summary>
/// 将各种类型的值写入ini。
/// (string字符串,int整型,float单精度型,double双精度型,bool布尔型,DateTime日期型)
/// </summary>
/// <param name="Section">小节名</param>
/// <param name="Ident">关键字</param>
/// <param name="Value">要写入的值</param>
private void WriteString(string Section, string Ident, string Value)
{
if (!WritePrivateProfileString(Section, Ident, Value, FileName))
{
// Todo:抛出自定义的异常
throw (new ApplicationException("写Ini文件出错"));
}
}
public void WriteIniFile(string Section, string Ident, string Value)//字符串
{
WriteString(Section, Ident, Value);
}
public void WriteIniFile(string Section, string Ident, int Value)//整型
{
WriteString(Section, Ident, Value.ToString());
}
public void WriteIniFile(string Section, string Ident, bool Value)//布尔型
{
WriteString(Section, Ident, Value.ToString());
}
public void WriteIniFile(string Section, string Ident, DateTime Value)//日期型
{
WriteString(Section, Ident, Value.ToString());
}
public void WriteDouble(string Section, string Ident, float Value)//单精度型
{
WriteString(Section, Ident, Value.ToString());
}
public void WriteDouble(string Section, string Ident, double Value)//双精度型
{
WriteString(Section, Ident, Value.ToString());
}
/// <summary>
/// 从ini文件中读取各种类型的值。
/// (string字符串,int整型,float单精度型,double双精度型,bool布尔型,DateTime日期型)
/// 当读取失败时返回缺省值。
/// </summary>
/// <param name="Section">小节名</param>
/// <param name="Ident">关键字</param>
/// <param name="Default">缺省值</param>
/// <returns>string型值</returns>
private string ReadString(string Section, string Ident, string Default)
{
//StringBuilder Buffer = new StringBuilder(255);
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 string ReadIniFile(string Section, string Key, string Default) //读INI文件<字符串>
{
return ReadString(Section, Key, Default);
}
public int ReadIniFile(string Section, string Ident, int Default) //读INI文件<整型>
{
string intStr = ReadString(Section, Ident, Default.ToString());
try
{
return Convert.ToInt32(intStr);
}
catch (Exception)
{
//Console.WriteLine(ex.Message);
return Default;
}
}
public bool ReadIniFile(string Section, string Ident, bool Default) //读INI文件<布尔型>
{
try
{
return Convert.ToBoolean(ReadString(Section, Ident, Default.ToString()));
}
catch (Exception)
{
//Console.WriteLine(ex.Message);
return Default;
}
}
public DateTime ReadIniFile(string Section, string Ident, DateTime Default) //读INI文件<日期型>
{
try
{
return Convert.ToDateTime(ReadString(Section, Ident, Default.ToString()));
}
catch (Exception)
{
return Default;
}
}
public double ReadIniFile(string Section, string Ident, float Default) //读INI文件<单精度型>
{
try
{
return Convert.ToDouble(ReadString(Section, Ident, Default.ToString()));
}
catch (Exception)
{
return Default;
}
}
public double ReadIniFile(string Section, string Ident, double Default) //读INI文件<双精度型>
{
try
{
return Convert.ToDouble(ReadString(Section, Ident, Default.ToString()));
}
catch (Exception)
{
return Default;
}
}
#endregion