原文 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. sql中update,alter,modify,delete,drop的区别和使用(整理)(转)

    关于update和alter: 百度知道上关于update和alter有一个很形象的总结: 一个表有很多字段,一个字段里有很多数据. 一个家有很多房间,一个房间里有很多家具. update是用来将衣柜 ...

  2. OR扩展

    <pre name="code" class="sql">SQL> select substr(xx.acct_no,1,5) agent_o ...

  3. 转:String.Empty、string=”” 和null的区别

    原文地址:http://www.cnblogs.com/fanyong/archive/2012/11/01/2750163.html String.Empty是string类的一个静态常量: Str ...

  4. 在线服装零售商Betabrand获得650万美元风投 - 投资风向 - 创业邦

    在线服装零售商Betabrand获得650万美元风投 - 投资风向 - 创业邦 在线服装零售商Betabrand获得650万美元风投

  5. PDO如何选择其他数据库的驱动

    $dsn = "mysql(用的mysql的驱动):dbname=testdb(连接数据库名称);host=127.0.0.1(IP地址,本地是:localhost)"

  6. 7 个改变世界的 Java 项目

    英文链接:http://radar.oreilly.com/2011/07/7-java-projects.html 文章转载自:开源中国社区 http://www.oschina.net/news/ ...

  7. CGI、FastCGI和php-fpm的区别

    参考网上的描述,将网上的描述内容,整理进来: 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者.web server(比如说nginx)只是 ...

  8. ASP.NET 实现PDF文件下载

    本文介绍了一种在ASP.NET中下载文件的方法. 方法一:可能是最简单的.最短的方式: Response.ContentType = "application/pdf"; Resp ...

  9. [置顶] STM32移植contiki进阶之三(中):timer 中文版

    鉴于自己英语水平不高,在这里,将上一篇关于contiki 的timer的文章翻译为中文,让自己在学习的时候,更方便点.文中有许多不是很通顺的地方,将就吧. Timers Contiki系统提供了一套时 ...

  10. 仿糯米弹框效果demo

    代码例如以下: <!doctype html> <html lang="en"> <head> <meta charset="U ...