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;
目录
相关文章
|
图形学 索引
Unity 之 三种抽奖示例
Unity做的三种抽奖的示例,根据需求修改动画时间和效果以及获取概率,文末附示例链接。
1299 0
Unity 之 三种抽奖示例
|
JSON 前端开发 Java
前端请求SpringBoot接口出现Required request body is missing
前端请求SpringBoot接口出现Required request body is missing
697 2
|
2月前
|
存储 数据可视化 容灾
开发PACS系统的技术难点解析:从数据管理到性能优化
开发PACS系统面临多重技术与合规挑战:海量影像数据的高效存储与分层管理、高并发下的实时调阅性能、DICOM标准的深度兼容、专业级图像处理与Web化可视化、与HIS/RIS/EMR系统的无缝集成、7×24小时高可用与数据安全,以及严格的医疗设备注册与网络安全认证。需融合存储架构、协议解析、临床流程与法规合规,构建稳定可靠的临床级系统,技术壁垒极高。
213 3
|
7月前
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
463 14
|
10月前
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
472 10
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
444 1
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
806 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
算法 网络协议 Python
python比较TCP_NODELAY启用与否的耗时
Nagle算法是TCP中的一种流量控制算法,它会将小的数据包合并成大的数据包,减少TCP数据包传输的开销,提高网络传输的效率。但是,Nagle算法会将ACK响应延迟一段时间,导致并不是每个数据包到达服务端都会立即得到响应。对于实时性要求较高的应用,可以禁用Nagle算法,从而使得数据包能够及时到达服务端并立即得到响应。
437 0
|
存储 编译器 程序员
面向 C++ 的现代 CMake 教程(二)(5)
面向 C++ 的现代 CMake 教程(二)
424 0
|
编译器 C语言 Android开发
Qt5安装及组件选择(Qt 5.12)
Qt5安装及组件选择(Qt 5.12)
1734 2