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

原文 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;
时间: 2025-01-20 18:59:07

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

C#中如何读写INI文件

在C#中读取和写入ini文件的一段代码,其实本文只是指出一个方向,希望大家能够触类旁通. 以下为代码全文:    //写INI文件 [ DllImport ( "kernel32" ) ] private static extern bool WritePrivateProfileString ( string section ,string key , string val , string filePath ) ; //读ini文件(字符 [ DllImport ( "k

教你在C#中如何读写INI文件

在C#中读取和写入ini文件的一段代码,其实本文只是指出一个方向,希望大家能够触类旁通. //写INI文件 [ DllImport ( "kernel32" ) ] private static extern bool WritePrivateProfileString ( string section ,string key , string val , string filePath ) ; //读ini文件(字符 [ DllImport ( "kernel32"

win7下iis中配置php.ini文件

将php.ini-development配置文件重命名为php.ini配置文件即可. 接着做如下配置操作: 1.修改php.ini配置文件 打开php.ini配置文件,找到 12 ; On windows:; extension_dir = "ext" 修改为 12 ; On windows:extension_dir = "C:/php/ext" 表示指定PHP扩展包的具体目录,以便调用相应的DLL文件. 2.开启Mysql相应的扩展库功能 由于默认PHP并不支持

在C#中如何读写INI文件

//写INI文件[ DllImport ( "kernel32" ) ]private static extern bool WritePrivateProfileString ( string section ,string key , string val , string filePath ) ; //读ini文件(字符[ DllImport ( "kernel32" ) ]private static extern int GetPrivateProfile

在NamedJdbcTemplate中怎么获取被修改行的自增键值呢

问题描述 现在有一条SQL语句是以INSERTINTO***ONDUPLICATEKEYSET***的形式写的,这样的话,KeyHolder只能在真正插入数据时获得插入行的自增ID,但如果是UPDATE就无法获取被UPDATE行的值.这种情形下,除了先UPDATE再SELECT获取自增ID,有别的方法只访问一次数据库就既UPDATE了又能获取自增ID的值吗?

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

原文:关于C#操作INI文件的总结          INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下: [Section1]key 1 = value2key 1 = value2--[Section2]key 1 = value1key 2 = value2-- 文件由若干个段落(section)组成,每个段落又分成若干个键(key)和值(value).Windows系统自带的Win32的API函数GetPrivateProfileString()和WritePriv

C#中读写ini文件

C#中没有读写ini文件的类,但用API函数很容易实现. 窗体代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices; namespace IniFile

Windows XP下BOOT.INI文件解析

电脑中安装有多个操作系统的朋友知道,在电脑加电自检后会出现一个启动菜单,它列出了在这台电脑上安装的所有的操作系统,用户使用"↑""↓"键可以选择进入哪个系统.实际上这一切都源于一个名为BOOT.INI的文件,自Windows NT开始它就存在于Windows系统中.Windows XP主要依赖BOOT.INI文件来确定计算机在重启(引导)过程中显示的可供选取的操作系统类别.一般情况下,它位于C盘根目录下,在默认状态下是一个隐藏只读的系统配置文件.要查看它,只要去掉

boot.ini文件怎么打开?

  Boot.ini文件位于C盘根目录下,是一个隐藏文件,在"运行"中输入"c:boot.ini"即可启动该文件.该文件包含缺省(默认)状态下该启动那个磁盘分区的操作系统.是否有多个系统供用户选择.引导菜单出现的时间长短.引导进入系统的磁盘分区格式.硬盘格式等等信息,它位于操作系统所在磁盘分区的根目录下,通常就在C盘根目录下. boot.ini文件怎么打开 由于Boot.ini文件是隐藏文件,所以要找到Boot.ini文件必须先设置文件查看方式,将隐藏文件都显示出来