IniFile Ini操作

 

INI文件的结构如下

[小节名]
关键字=值

uses IniFiles;  {操作Ini文件需要引用TIniFile 的单元}

常用的方法

WriteString     写入字符串

WriteInteger  写入数字

WriteBool       写入布尔值

ReadString    读取字符串值

ReadInteger  读取数字

ReadBool      读取布尔值

ReadSections   读取小节列表

ReadSection    读取某小节下关键字列表

ReadSectionValues    读取某小节下所有内容列表,包括关键字和值

写入
view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
var 
  F:TIniFile;  
begin 
  F := TIniFile.Create('c:/A.ini');          //如果文件存在则打开,如果不存在,当向其中写入数据时,将创建ini文件  
  F.WriteString('PersonInfo','姓名','张三');  
  F.WriteInteger('PersonInfo','年龄',20);  
  F.WriteBool('PersonInfo','婚否',False);  
end; 
var
  F:TIniFile;
begin
  F := TIniFile.Create('c:/A.ini');          //如果文件存在则打开,如果不存在,当向其中写入数据时,将创建ini文件
  F.WriteString('PersonInfo','姓名','张三');
  F.WriteInteger('PersonInfo','年龄',20);
  F.WriteBool('PersonInfo','婚否',False);
end;

读取:读取方法的第三个参数表示,当读取失败时,返回的结果,
view plaincopy to clipboardprint?
var 
  F:TIniFile;  
  name:string;  
  age:Integer;  
  merry:Boolean;  
begin 
  F := TIniFile.Create('c:/A.ini');  
  name := F.ReadString('PersonInfo','姓名','无名氏');   //当读取失败时,返回'无名氏',否则返回读取的值  
  age := F.ReadInteger('PersonInfo','年龄',20);  
  merry := F.ReadBool('PersonInfo','婚否',False);  
end; 
var
  F:TIniFile;
  name:string;
  age:Integer;
  merry:Boolean;
begin
  F := TIniFile.Create('c:/A.ini');
  name := F.ReadString('PersonInfo','姓名','无名氏');   //当读取失败时,返回'无名氏',否则返回读取的值
  age := F.ReadInteger('PersonInfo','年龄',20);
  merry := F.ReadBool('PersonInfo','婚否',False);
end;

 读取小节的列表
view plaincopy to clipboardprint?
var 
  F:TIniFile;  
  List:TStringList;  
begin 
  try 
    List := TStringList.Create;  
    F := TIniFile.Create('c:/A.ini');  
    F.ReadSections(List);              //将小节依次读取到List中  
    ShowMessage(List.Text);            //显示小节列表内容  
  finally 
    List.Free;  
    F.Free;  
  end;  
end; 
var
  F:TIniFile;
  List:TStringList;
begin
  try
    List := TStringList.Create;
    F := TIniFile.Create('c:/A.ini');
    F.ReadSections(List);              //将小节依次读取到List中
    ShowMessage(List.Text);            //显示小节列表内容
  finally
    List.Free;
    F.Free;
  end;
end;

读取某小节下的关键字列表
 view plaincopy to clipboardprint?
var 
  F:TIniFile;  
  List:TStringList;  
begin 
  try 
    List := TStringList.Create;  
    F := TIniFile.Create('c:/A.ini');  
    F.ReadSection('PersonInfo',List);              //将小节依次读取到List中  
    ShowMessage(List.Text);            //显示'PersonInfo'小节下关键字列表内容  
  finally 
    List.Free;  
    F.Free;  
  end;  
end; 
var
  F:TIniFile;
  List:TStringList;
begin
  try
    List := TStringList.Create;
    F := TIniFile.Create('c:/A.ini');
    F.ReadSection('PersonInfo',List);              //将小节依次读取到List中
    ShowMessage(List.Text);            //显示'PersonInfo'小节下关键字列表内容
  finally
    List.Free;
    F.Free;
  end;
end;

 读取某小节下所有内容列表,包括关键字和值
view plaincopy to clipboardprint?
var 
  F:TIniFile;  
  List:TStringList;  
begin 
  try 
    List := TStringList.Create;  
    F := TIniFile.Create('c:/A.ini');  
    F.ReadSectionValues('PersonInfo',List);              //将小节依次读取到List中  
    ShowMessage(List.Text);            //读取某小节下所有内容列表,包括关键字和值  
  finally 
    List.Free;  
    F.Free;  
  end;  
end; 
var
  F:TIniFile;
  List:TStringList;
begin
  try
    List := TStringList.Create;
    F := TIniFile.Create('c:/A.ini');
    F.ReadSectionValues('PersonInfo',List);              //将小节依次读取到List中
    ShowMessage(List.Text);            //读取某小节下所有内容列表,包括关键字和值
  finally
    List.Free;
    F.Free;
  end;
end;

其它常用方法
EraseSection  删除某个小节
DeleteKey      删除关键字
SectionExists 判断某个章节是否存在
ValueExists   判断某个小节下的某个关键字是否存在

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bdmh/archive/2009/05/04/4147104.aspx

一、INI文件的结构: 
; 注释 
[小节名] 
关键字=值 

INI文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值。  
值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文件中时没有引号,布尔真值用1表示,布尔假值用0表示。  
注释以分号“;”开头。  

二、定义 
1、在Interface的Uses节增加IniFiles;  
2、在Var变量定义部分增加一行:  
myinifile:Tinifile; 
然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。 

三、打开INI文件  

Filename:=ExtractFilePath(Paramstr(0))+’program.ini’; 
myinifile:=Tinifile.Create(filename); 

四、读取关键字的值 

针对INI文件支持的字符串、整型数值、布尔值三种数据类型,TINIfiles类提供了三种不同的对象方法来读取INI文件中关键字的值。  
vs:=myinifile.Readstring(’小节名’,’关键字’,缺省值); string类型  

vi:=myinifile.Readinteger(’小节名’,’关键字’,缺省值);integer类型 

vb:=myinifile.Readbool(’小节名’,’关键字’,缺省值); boolean类型 

五、写入INI文件 

myinifile.writestring(’小节名’,’关键字’,变量或字符串值); string类型 

myinifile.writeinteger(’小节名’,’关键字’,变量或整型数值);integer类 

myinifile.writebool(’小节名’,’关键字’,变量或True或False);boolean类型  

当这个INI文件不存在时,上面的语句还会自动创建该INI文件。 

六、删除关键字  

myinifile.DeleteKey(’小节名’,’关键字’); 

七、小节操作  

增加一个小节可用写入的方法来完成,删除一个小节可用下面的对象方法:myinifile.EraseSection(’小节名’);另外Tinifile类还提供了三种对象方法来对小节进行操作: 

myinifile.readsection(’小节名’,TStrings变量); 

可将指定小节中的所有关键字名读取至一个字符串列表变量中;  

myinifile.readsections(TStrings变量); 

可将INI文件中所有小节名读取至一个字符串列表变量中去。  

myinifile.readsectionvalues(’小节名’,TStrings变量); 

可将INI文件中指定小节的所有行(包括关键字、=、值)读取至一个字符串列表变量中去。  

八、释放 

在适当的位置用下面的语句释放myinifile: 

myinifile.distory; 
  

 
2005-8-24 15:07 回复  
 
pathog 
0位粉丝 
 2楼

利用Windows API函数WritePrivateProfileString 和GetPrivateProfileString可对.INI文件进行读写操作。其实,对.INI文件的读写完全可以利用Delphi的内置函数来实现。下面就介绍一些对.INI文件读写时相关的类及其属性方法。 

1、TIniFile对象 

 以Delphi中,定义了一个TIniFile对象,将.INI文件封装在其中,并提供一些方法,专门用来对INI文件进行读写操作。如果在程序中要用到TIniFile类或其方法属性,就必须在程序单元的uses语句中手工加入对IniFiles单元的引用。 

2、Create方法 

 该方法用来创建一个处理INI文件的TIniFile类型实例。 

 方法声明:constructor Create(const FileName:string); 

 参数说明:FileName指明待创建的INI文件的文件名; 

 注释:在使用TIniFile对象之前,必须先用此方法创建一个INI文件的实例。FileName中可以包含路径名,缺省时为Windows所在目录(一般就是C:windows,对于Windows NT来说,则一般是c:winnt)。用Create方法创建的实例,在使用完之后,调用Free方法释放内存。 

3、ReadSection方法 

 该方法从INI文件中读出指定段的所有子键名,并存入Strings参数指定的字符串列表对象中。 

 方法声明:procedure ReadSection(const Section:string; Strings:TStrings); 

 参数说明:Section指明要读取段的段名; 

 Strings指明存放子键名的字符串列表; 

 注释:ReadSection方法仅读入指定段的所有子键名,但不读入子键的值。 

4、ReadSections方法 

 该方法从INI文件中读取所有段名,并存入Strings参数指定的字符中列表中。 

 方法声明:procedure ReadSections(Strings:TStrings); 

 参数说明:Strings参数指明存放段名的字符串列表; 

 注释:ReadSections方法将INI文件中所有段的段名读出,存入一指定的字符串列表中,此字符串列表可以直接使用某个列表框的Items属性。 

5、ReadSectionValues方法 

 该方法从INI文件中读入指定段的所有子键名及其键值,并存入Strings参数指定的字符串列表中。 

 方法声明:procedure ReadSectionValues(const Section:String; Strings:TStrings); 

 参数说明:Section指明要读取段的段名; 

 Strings指明存放段名的字符串列表; 

 注释:ReadSectionValues方法与ReadSection方法的区别在于后者仅读入子键名,面前者除了读取子键名之外,还读取该子键对应的键值。读入的子键名及键值在字符串列表中的存放方法与在文件中的显示方法一致,即"Key=Value"形式。 

6、EraseSection方法 

 该方法删除INI文件中指定的一个整段。 

 方法声明:procedure EraseSection(const Section:string); 

参数说明:Section指明待删除段的段名; 

注释:EraseSection方法不仅删除指定段的段名,面且同时将该段的所有子键及键值删除。 

7、DeleteKey方法 

 该方法删除指定段中的某个指定的子键。 

 方法声明:procedure DeleteKey(const Section,Key:string); 

 参数说明:Section指明待删除子键据段的段名; 

 Key指明待删除子键的键名; 

 注释:DeleteKey方法删除整个子键(包括键名和键值),也就是删除该子键所在的一行。 

8、ReadBool方法 

 该方法读取指定段的某个子键的布尔值。 

方法声明:function ReadBool(const Section,Key:string;Default:Boolean):Boolean; 

参数说明:Section指明待读子键所在段的段名; 

 Key指明待读子键的键名; 

 Default参数指明缺省时的返回值。 

注释:ReadBool方法用于读取一个子键的布尔型值,当键值为"1"时,返回True,键值为"0"时,返回False. 

9、WriteBool方法 

 该方法向指定段的某个子键写入布尔值。 

 方法声明:procedure WriteBool(const Section, Key:string; Value:Boolean); 

 参数说明:Senction指明待写入子键所在段的段名; 

 Key参数指明待写入值的子键键名; 

 Value指明待写入的布尔值; 

 注释:WriteBool 方法用于写入一个子键的布尔值,当Value为"True"时,写入"1"。Value为"Flase"时,写入"0"。若在写入时,指定的段或键名不存在,则自动创建该段和键名。 

10、ReadInteger方法 

 该方法读取指定段的某个子键的整型值。 

 方法声明:function ReadInteger(const Section,Key:string; Default:longint):longint; 

 注释:此方法与ReadBool方法类似,只是变量类型不同。 

11、WriteInteger方法 

 该方法向指写段的某个子键写放整型值。 

 方法声明:procedure WriteInteger(const Section,Key:string; Value:longint); 

 注释:此方法与WriteBool方法类似,只是变量灰型不同。 

12、ReadString方法 

 该方法读取指定段的某个子键的字符串型 值。 

 方法声明:function ReadString(const Section,Key:string; Default:string):string; 

 注释;此方法与ReadBool方法类似,只是变量类型不同。 

13、WriteString方法 

 该方法向指写段的某个子键写入整型值。 

 方法声明:procedure WriteString(const Section,Key:string; Value:string); 

 注释:此方法与WriteBool方法类似,只是变量类型不同。 

14、FileName属性  

 该属性指明被封装在TIniFile对象中的INI文件的文件名。 

 属性声明:property FileName:string; 

 注释:FileName属性是一个运行时的只读属性。 

 由一面的介绍,我们可以看到,强大的Delphi对INI文件的支持是非常全面的。我们在编写涉及此类操作的程序时,几乎无需使用Windows API函数
 
2005-8-24 15:09 回复  
 
pathog 
0位粉丝 
 3楼

越来越多的程序使用了多国语言切换,虽然DELPHI自带多语言包的添加和配置,但是那种方法在切换语言时界面会出现闪烁,而且实现起来很麻烦,这里我介绍给大家的是利用INI文件来读取界面的语种文字,用这种方法,不但简单易行,而且在切换的时候不会出现界面的闪烁。 
 我们从一个例子出发,看看怎么实现语言的切换。首先建立一个新工程。 
放置如下组件: 
 MainMenu1: TMainMenu; 
 File1: TMenuItem; 
 Exit1: TMenuItem; 
 Label1: TLabel; 
 Button1: TButton; 
 CheckBox1: TCheckBox; 
 CheckBox2: TCheckBox; 
 Button2: TButton; 
 Label2: TLabel; 
 ComboBox1: TComboBox; 
 Label3: TLabel; 
由于要读取Ini文件,所以在USES中加入声明IniFiles;然后将Button1和Button2的ShowHint属性设置为True;其中我们用ComboBox1来显示可供选择的语言和用来选择语言。 
我们在程序的目录下编辑如下的Chinese GB.Ini文件: 
;/// 

; 翻译的一些规则: 
; 翻译前,拷贝 Chinese GB.ini 改名到 yourlanguage.ini 
; 仅仅翻译符号'='后的文字 


[Translations] 

Label1.Caption =文字1 
Label2.Caption =文字2 
Label3.Caption =语言 
Button1.Caption =按钮1 
Button2.Caption =按钮2 
Button1.Hint =按钮1_提示 
Button2.Hint =按钮2_提示 
CheckBox1.Caption =复选框1 
CheckBox2.Caption =复选框2 
File1.Caption =文件 
Exit1.Caption =退出 

[Messages] 
;  
M1 =信息框测试 

;// 
同样的方法编辑一个名为English.ini的文件,将“=”左边的文字改为英文。 
例如:Label1.Caption =Label1 

程序运行时,我们查找当前目录下所有的语言配置文件(*.ini),为了达到这个目的,我编写了如下的函数搜索目录下所有的语言配置文件的文件名,然后将文件名去掉ini扩展名保存返回: 
function TForm1.SearchLanguagePack:TStrings; 
var 
 ResultStrings:TStrings;  
 DosError:integer; 
 SearchRec:TsearchRec; 
begin 
 ResultStrings:=TStringList.Create; 
 DosError:=FindFirst(ExtractFilePath(ParamStr(0))+'*.ini', faAnyFile, SearchRec); 
 while DosError=0 do 
 begin 
 { 返回的文件名并去掉末尾的.ini字符 } 
 ResultStrings.Add(ChangeFileExt(SearchRec.Name,')); 
 DosError:=FindNext(SearchRec); 
 end; 
 FindClose(SearchRec); 
 Result:=ResultStrings; 
end; 

在Form建立的事件中添加代码,将目录下所有的语言文件名加入选择列表框中。 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
 ComboBox1.Items.AddStrings(SearchLanguagePack); 
end; 

程序的重点在如何切换语言,在ComboBox1的OnChange事件中进行切换操作。这里我写了SetActiveLanguage过程用于实现这一操作。 
procedure TForm1.ComboBox1Change(Sender: TObject); 
begin 
 SetActiveLanguage(ComboBox1.Text); 
end; 
其中SetActiveLanguage代码如下: 
procedure TForm1.SetActiveLanguage(LanguageName:string); 
const 
 Translation_s='Translations'; 
 Messages='Messages'; 
var 
 frmComponent:TComponent; 
 i:Integer; 
begin 
 with TInifile.Create(ExtractFilePath(ParamStr(0))+LanguageName+'.ini') do 
 begin 
 for i:=0 to ComponentCount-1 do { 遍历Form组件 } 
 begin 
 frmComponent:=Components[i]; 
 if frmComponent is TLabel then { 如果组件为TLabel型则当作TLabel处理,以下同 } 
 begin 
 (frmComponent as TLabel).Caption:= 
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TLabel).Caption); 
 end; 
 if frmComponent is TCheckBox then 
 begin 
 (frmComponent as TCheckBox).Caption:= 
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TCheckBox).Caption);  
 end; 
 if frmComponent is TButton then 
 begin 
 (frmComponent as TButton).Caption:= 
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TButton).Caption); 
 (frmComponent as TButton).Hint:= 
ReadString(Translations,frmComponent.Name+'.Hint',(frmComponent as TButton).Hint); 
 end; 
 if frmComponent is TMenuItem then 
 begin 
 (frmComponent as TMenuItem).Caption:= 
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TMenuItem).Caption); 
 end; 
 end; 
 M1:=ReadString(Messages,'M1',M1); 
 end; 
end; 
在这个过程中,我们遍历了Form中的所有组件,根据他们的类别和组件名动态的从ini配置文件中读出应该显示的语言文字。 
用遍历组件的方法比一个一个写出具体的组件维护起来要方便很多,代码的适应性也更强。 
其中M1为一个字符串变量,这样提示消息也能切换,比如在Button1的Click事件中 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
 ShowMessage(M1); 
end; 
就可以根据不同的语言给出不同的提示文字。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。
// 引入命名空间 using System.IO; using System.Collections.Generic; // 创建一个类来处理INI文件的读写操作 public class INIFile { // 定义一个字典来存储INI文件中的键值对 private Dictionary<string, Dictionary<string, string>> iniData; // 构造函数,初始化INI文件数据 public INIFile() { iniData = new Dictionary<string, Dictionary<string, string>>(); } // 读取INI文件的方法 public void Read(string filePath) { // 检查文件是否存在 if (!File.Exists(filePath)) { throw new FileNotFoundException("INI文件不存在。"); } // 读取文件内容 string[] lines = File.ReadAllLines(filePath); // 定义当前节的名称 string currentSection = null; // 遍历文件内容 foreach (string line in lines) { // 去掉行首和行尾的空格 string trimmedLine = line.Trim(); // 判断是否为空行或注释行 if (string.IsNullOrEmpty(trimmedLine) || trimmedLine.StartsWith(";") || trimmedLine.StartsWith("#")) { continue; } // 判断是否为节名 if (trimmedLine.StartsWith("[") && trimmedLine.EndsWith("]")) { // 获取节名 currentSection = trimmedLine.Substring(1, trimmedLine.Length - 2); // 如果字典中不存在该节,则添加一个新的节 if (!iniData.ContainsKey(currentSection)) { iniData[currentSection] = new Dictionary<string, string>(); } } else { // 如果当前节未定义,则抛出异常 if (currentSection == null) { throw new InvalidDataException("INI文件格式不正确。"); } // 分割键值对 string[] keyValue = trimmedLine.Split('='); // 如果键值对格式不正确,则抛出异常 if (keyValue.Length != 2) { throw new InvalidDataException("INI文件格式不正确。"); } // 获取键和值 string key = keyValue[0].Trim(); string value = keyValue[1].Trim(); // 如果字典中不存在该键,则添加一个新的键值对 if (!iniData[currentSection].ContainsKey(key)) { iniData[currentSection][key] = value; } } } } // 写入INI文件的方法 public void Write(string filePath) { // 创建一个字符串列表,用于存储INI文件内容 List<string> lines = new List<string>(); // 遍历字典中的每个节和键值对,将它们写入字符串列表中 foreach (KeyValuePair<string, Dictionary<string, string>> section in iniData) { lines.Add("[" + section.Key + "]"); foreach (KeyValuePair<string, string> keyValue in section.Value) { lines.Add(keyValue.Key + "=" + keyValue.Value); } lines.Add(""); } // 将字符串列表写入文件 File.WriteAllLines(filePath, lines); } // 获取INI文件中指定节和键的值 public string GetValue(string section, string key) { // 如果指定的节和键不存在,则返回空字符串 if (!iniData.ContainsKey(section) || !iniData[section].ContainsKey(key)) { return ""; } // 返回指定节和键的值 return iniData[section][key]; } // 设置INI文件中指定节和键的值 public void SetValue(string section, string key, string value) { // 如果指定的节不存在,则添加一个新的节 if (!iniData.ContainsKey(section)) { iniData[section] = new Dictionary<string, string>(); } // 设置指定键的值 iniData[section][key] = value; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值