InnoSetup中枚举出INI文件的所有sections和键值

简介: 原文 http://blog.chinaunix.net/uid-23480430-id-3016899.html InnoSetup支持一些INI文件操作函数, 例如GetIniString,IniKeyExists等等。

原文 http://blog.chinaunix.net/uid-23480430-id-3016899.html

InnoSetup支持一些INI文件操作函数,

例如GetIniString,IniKeyExists等等。。
利用这些已有的函数,读取/删除/检测键值是否存在,都没有问题。
 
但是,想要列出一个INI文件有哪些Sections, 
某个Section下面有哪些键值,
就没法做到了。
 
所幸InnoSetup有个很好用的 LoadStringsFromFile 函数,
用来读取文本文件很方便,读INI自然不在话下。
然后再做一点简单的解析,就能得到一个INI中所有的sections和键值了。
 
实现两个函数如下:
 
读取INI文件中有哪些Sections, 并将其名字存放到 Arr数组里。
procedure IniGetSections(var Arr: Array of String; const Path: String);
 
读取INI文件的某个Section底下,有哪些键名,并将这些键名存放到Arr数组里。
procedure IniGetKeys(var Arr: Array of String; const Path: String; const Section: String);
 
  1. procedure ArrayAddStr(var Arr: Array of String; Str: String);
  2. var
  3.   Len: Longint;
  4. begin
  5.   Len := GetArrayLength(Arr);
  6.   SetArrayLength(Arr, Len + 1);
  7.   Arr[Len] := Str;
  8. end;
  9. //-- INI
  10. function IniGetSectionName(Line: String; var Name: String): Boolean;
  11. var
  12.   P0, P1: Integer;
  13. begin
  14.     Line := TrimLeft(Line);
  15.     P0 := Pos('[', Line);
  16.     P1 := Pos(']', Line);
  17.     if (P0 = 1) and (P1 > P0 + 1) then begin
  18.       Name := Copy(Line, P0 + 1, P1 - P0 - 1);
  19.       Result := True;
  20.     end
  21.     else
  22.       Result := False;
  23. end;
  24. function IniGetKeyName(Line: String; var Name: String): Boolean;
  25. var
  26.   P0, P1: Integer;
  27. begin
  28.   Line := TrimLeft(Line);
  29.   P0 := Pos('=', Line);
  30.   P1 := pOS(';', Line); //; is start of comment
  31.   if (P0 > 1) and ((P1 = 0) or (P1 > P0)) then begin
  32.     Name := Trim(Copy(Line, 1, P0 - 1));
  33.     Result := True;
  34.   end
  35.   else
  36.     Result := False;
  37. end;
  38. procedure IniGetSections(var Arr: Array of String; const Path: String);
  39. var
  40.   i: Longint;
  41.   Name: String;
  42.   Lines: Array of String;
  43. begin
  44.   SetArrayLength(Arr, 0);
  45.   if not LoadStringsFromFile(Path, Lines) then exit;
  46.   for i := 0 to GetArrayLength(Lines) - 1 do begin
  47.     if IniGetSectionName(Lines[i], Name) then ArrayAddStr(Arr, Name);
  48.   end;
  49. end;
  50. procedure IniGetKeys(var Arr: Array of String; const Path: String; const Section: String);
  51. var
  52.   i: Longint;
  53.   Name: String;
  54.   Lines: Array of String;
  55. begin
  56.   SetArrayLength(Arr, 0);
  57.   if not LoadStringsFromFile(Path, Lines) then exit;
  58.   for i := 0 to GetArrayLength(Lines) - 1 do begin
  59.     if IniGetSectionName(Lines[i], Name) then begin
  60.       if CompareText(Name, Section) = 0 then break;
  61.     end;
  62.   end;
  63.   if i < GetArrayLength(Lines) then begin
  64.     { The section is }
  65.     for i := i + 1 to GetArrayLength(Lines) - 1 do begin
  66.       if IniGetSectionName(Lines[i], Name) then break
  67.       else if IniGetKeyName(Lines[i], Name) then ArrayAddStr(Arr, Name);
  68.     end;
  69.   end;
  70. end;
目录
相关文章
|
5月前
|
Serverless PHP
【PHP常用函数封装】 php 判断a数组里是否完全包含b数组
【PHP常用函数封装】 php 判断a数组里是否完全包含b数组
34 1
|
存储 API 数据格式
Qt通过QSttings类读取*.ini配置文件
Qt通过QSttings类读取*.ini配置文件
218 0
|
存储 数据库
扩展字典配置文件的元素组成
扩展字典配置文件的元素组成
80 0
C#编程-141:读取注册表(遍历
C#编程-141:读取注册表(遍历
181 0
C#编程-141:读取注册表(遍历
vbs的字典存入和读取操作 comparemode属性
vbs的字典存入和读取操作 comparemode属性
C#编程-141:读取注册表(遍历)
C#编程-141:读取注册表(遍历)
190 0
C#编程-141:读取注册表(遍历)
|
安全 PHP
使用PHP中3个神奇常量快速获取目录、文件名和行号
在上一篇《还分不清PHP中fgets、fgetss和fgetcsv吗?快收藏!》中给大家介绍了PHP中fgets、fgetss和fgetcsv的区别使用,有需要的朋友可以学习了解一下~ 本文的主要内容则是介绍如何使用PHP中3个神奇的常量来快速获取当前目录、文件名和行号!
230 0
VBS获取Ini配置文件一个节点下的所有字段的值
''* 功能:使用VBS读取ini文件中指定节点下的所有值'* 输入参数:inipath :ini文件的地址'*           initypes :ini文件中包含在"["和"]"之间的值'* 返回值:找到的字段的值组成的array'* 编写人:  chenyb'* 编写日期:2008-12-...
1043 0