原文 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;

InnoSetup中枚举出INI文件的所有sections和键值的更多相关文章

  1. 向php文件中添加php.ini文件

    向php文件中添加php.ini文件 默认情况下,php是没有php.ini配置文件的,必须手工添加php.ini文件 在php安装目录中,复制php.ini文件到/usr/local/php/lib ...

  2. [转载]windows7中没用boot.ini文件而是改用BCDEDIT来配置了

    原文地址:windows7中没用boot.ini文件而是改用BCDEDIT来配置了作者:开心骝哥 本人安装的Win7,因为机上有两个系统,一个dos系统,一个win7系统,开机时总是会在系统选择的界面 ...

  3. win7下iis中配置php.ini文件

    将php.ini-development配置文件重命名为php.ini配置文件即可. 接着做如下配置操作: 1.修改php.ini配置文件 打开php.ini配置文件,找到 12 ; On windo ...

  4. web安全之php中常见的INI文件配置

    php.ini 在 PHP 启动时被读取.对于服务器模块版本的 PHP,仅在 web 服务器启动时读取 一次.对于 CGI 和 CLI 版本,每次调用都会读取. * Apache web 服务器在启动 ...

  5. IDEA中怎么创建ini文件

    首先博主在这使用的是idea的2019.3.2的版本,不知道的话可以打开help菜单的about查看 第一步: 具体需要在setings安装ini插件 第二步: 在File Types中查看ini,没 ...

  6. 获取ini文件所有的Sections和Keys

    获取ini文件中所有的Sections和Keys,并以pair对的方式存入到vector中 #include <iostream> #include <windows.h> # ...

  7. 利用FastJson,拼接复杂嵌套json数据&&直接从json字符串中(不依赖实体类)解析出键值对

    1.拼接复杂嵌套json FastJson工具包中有两主要的类: JSONObject和JSONArray ,前者表示json对象,后者表示json数组.他们两者都能添加Object类型的对象,但是J ...

  8. Nginx中修改php.ini的上传设置upload_max_filesize的值

    普遍的网络越来越快,以前小家子气的2M上传限制慢慢变得不合时宜了.最近就把2M的限制直接提升到了20M...代码层面很快就修改好了,没什么可说的.但是上线的话还得修改一下服务器的配置.服务器是Ngin ...

  9. 关于C#操作INI文件的总结

    原文:关于C#操作INI文件的总结   INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下: [Section1]key 1 = value2key 1 = value2--[S ...

随机推荐

  1. c# splitter控件使用简介

    摘自:http://blog.itpub.net/26221264/viewspace-735903 1.先在窗体上放置部分一的控件,这里是TreeView控件,然后把它的 Dock 属性设置为 Le ...

  2. linux内存管理--伙伴系统和内存分配器

    3.1页框的管理 所有的页框描述符都存放在mem_map数组中. 3.1.1page数据结构 struct page { page_flags_t flags; //标志 atomic_t _coun ...

  3. Activity小结

    Log日志类的五种级别 1.由高到低分别是:v.i.d.w.e 2.生命周期有七种状态: onCreate:创建 onStart:启动 onResume:显示(可以与用户交互) onPause:暂停 ...

  4. [置顶] 【VB.NET2010】注册表写入方法

    这里,以添加启动项为例: Imports Microsoft.Win32 Imports System.Reflection.Assembly   Private Sub SetAuto_Click( ...

  5. Java第四周学习日记(绪)

    1.静态导入 作用:简化书写静态导入可以作用一个类的所有静态成员静态导入格式:import static 包名.类名静态导入要注意的事项:如果静态导入的成员与本类的成员存在同名的情况下,那么默认使用本 ...

  6. iptables 实现centos内网机器访问外网

    环境:一台带外网和内网的机器,另一台只有内网,默认不能上网.两台机器都是centos系统带外网机器的外网ip为 123.221.20.11, 内网ip为 192.168.15.100内网机器的内网ip ...

  7. .NET 4.0 兼容 .NET 2.0 的方法

    使用.net开发桌面应用,广大亲门最头疼的莫过于客户端部署的问题.基于.net 2.0 的winfrom程序因为 Framework 的分发包大小为20M左右还好解决,不幸的是如果项目中使用了Wcf, ...

  8. Gson 简易笔记

    #Gson 简易笔记 之前用 fastjson.它连个规矩的文档都没有,而且在github的wiki上写着: gson的g可能是"龟"拼音的缩写,龟速的json库." 各 ...

  9. 我永远的 dell 15r

    陪伴我三年多的15r  让我疯狂过.努力过.更记录了我很多的成长,与很多个瞬间.看到它是有感情的.还记得第一次失去她.我好像失去了自己. 我是一个程序员.每个程序员都有自己的环境配置.不同的软件.就是 ...

  10. visifire 图表属性样式设置说明,字体,阴影设置