;#include <_ini.au3>
#include <Array.au3>
$iFile = @ScriptDir & "\Config.ini"
$Section = 'FastStart'
;-----------------------------------------读取数据--读取正常--------------------------------------
Local $avArray = __IniReadToArray($iFile, $Section)
_ArrayDisplay($avArray, '读取配置文件')
Func __IniReadToArray($sIniFile, $Section, $idListview = 0, $sDecimal = '|') ;本函数由afan老师特别编写。第三个参数 $idListview是自己加的。
;ini文件路径 ;字段名 列表视图ID; ;分隔符
Local $sIni = FileRead($sIniFile)
Local $_Section = StringRegExpReplace($Section, '^\h*(.+?)\h*, '$1')
$_Section = StringRegExpReplace($_Section, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1')
$sIni = StringRegExpReplace($sIni, '(?mi)[\s\S]*?^\h*\[' & $_Section & '\]\V*\v+([\s\S]+?)(?=\r\n\h*\[|\z)[\s\S]*', '\1')
Local $aLine = StringRegExp($sIni, '\V+', 3)
If @error Then Return SetError(1)
Local $i, $afg, $j, $iMax = 1, $iC = 1
Local $aData[UBound($aLine)][$iMax]
For $i = 0 To UBound($aLine) - 1
If $idListview <> 0 Then GUICtrlCreateListViewItem($aLine[$i], $idListview) ;这一行是自己加的,使一个函数两用:生成二维数组、填充listview列表视图
$afg = StringSplit($aLine[$i], $sDecimal, 1)
For $j = 1 To $afg[0]
If $afg[0] > $iMax Then
$iMax = $afg[0]
ReDim $aData[UBound($aData)][$iMax]
EndIf
$aData[$i][$j - 1] = $afg[$j]
Next
Next
ReDim $aData[UBound($aData)][$iMax]
Return $aData
EndFunc ;==>__IniReadToArray
;----------------------------------------- 添加一行 实验成功--------------------------------------------
;以下内容基本都是从afan老师_ini.au3函数里搬来的,进行拼凑。
$key = 'tjyh'
$Val = '新|添|加|的|一|行|---------------'
$mode = 0
Local $s_File = _FileRead($iFile) ;用指定的FileOpen打开模式返回读取文件的字符串.
Local $_Section = StringRegExpReplace($Section, '^\h*(.+?)\h*, '$1') ;正则不懂,不知起什么作用
$_Section = StringRegExpReplace($_Section, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1') ;正则不懂,不知起什么作用
$_Section = '\[\h*' & $_Section & '\h*\]' ;这句很重要,也不知起什么作用
;去$key、$_Val前后不可见字符吧
Local $_key = StringRegExpReplace($key, '^\h*(.+?)\h*, '$1')
$_key = StringRegExpReplace($_key, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')
Local $_Val = StringRegExpReplace($Val, '^\h*(.+?)\h*, '$1')
$_Val = StringRegExpReplace($_Val, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')
;在某关键字下添加一行
$s_data = StringRegExpReplace(@CRLF & $s_File & @CRLF & '[', '(?si)(.*?\r?\n\h*' & $_Section & '.*?)((?:\r?\n)+)(\h*\[.*)', '$1' & @CRLF & $_key & '|' & $_Val & '$2$3') ;131022修正*为+;将'='改为'|'可用。
Local $FO = FileOpen($iFile, $mode + 2)
$s_data = StringTrimLeft($s_data, 2)
$s_data = StringTrimRight($s_data, 3)
$Write = FileWrite($FO, $s_data)
FileClose($FO)
ShellExecute($iFile)
;-------------------------- 删除一行----利用_ini.au3中的_IniDelete_line有些能删有些不能删 ------------------------------
$key = 'zh'
_IniDelete_line($iFile, $Section, $key) ;, $flag = 0, $mode = 0)
MsgBox(0,0,'看看zh删了没有')
ShellExecute($iFile)
$key = 'sx'
_IniDelete_line($iFile, $Section, $key) ;, $flag = 0, $mode = 0)
MsgBox(0,0,'看看sx删了没有')
ShellExecute($iFile)
$key = 'print'
_IniDelete_line($iFile, $Section, $key) ;, $flag = 0, $mode = 0)
MsgBox(0,0,'看看gg删了没有')
ShellExecute($iFile)
;----------------------------------------- 修改一行 如何实现?---------------------------------------------------------
;例如将刚加一行"tjyh|新|添|加|的|一|行|---------------"修改为"tjyh|修|改|动|的|一|行|---------------"
$iFile = @ScriptDir & "\Config-1.ini" ;配置文件
$Section = 'FastStart' ;字段名
$key = 'tjyh' ;关键字
$Val = "修|改|动|的|一|行|---------------" ;新键值
Local $s_File = _FileRead($iFile) ;用指定的FileOpen打开模式返回读取文件的字符串.
Local $_Section = StringRegExpReplace($Section, '^\h*(.+?)\h*, '$1') ;正则不懂,不知起什么作用
$_Section = StringRegExpReplace($_Section, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1') ;正则不懂,不知起什么作用
$_Section = '\[\h*' & $_Section & '\h*\]' ;这句很重要,也不知起什么作用
;去$key、$_Val前后不可见字符吧
Local $_key = StringRegExpReplace($key, '^\h*(.+?)\h*, '$1')
$_key = StringRegExpReplace($_key, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')
Local $_Val = StringRegExpReplace($Val, '^\h*(.+?)\h*, '$1')
$_Val = StringRegExpReplace($_Val, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')
$s_data = StringRegExpReplace('请教这里的正则该如何写呢?', '', '')
Local $FO = FileOpen($iFile, $mode + 2)
$s_data = StringTrimLeft($s_data, 2)
$s_data = StringTrimRight($s_data, 3)
$Write = FileWrite($FO, $s_data)
FileClose($FO)
ShellExecute($iFile) ;看看修改后的结果
;----------------------------------- 以下是afan老师的函数 ------------------------------------
; 函数名:_FileRead;============================================================================
; 说明: 用FileOpen的打开模式返回读取文件的字符串
;==========================================================================================start
Func _FileRead($iFile, $mode = 0)
Local $o_File = FileOpen($iFile, $mode)
Local $s_File = String(FileRead($o_File))
FileClose($o_File)
Return $s_File
EndFunc ;==>_FileRead
; 函数名:_IniReadSection_str;===================================================================
; 说明: 从(非)标准INI结构文件中读取某个字段(可选重复字段名)中的所有字符。
; 语法: _IniReadSection_str('ini文件路径', '字段名'[, 打开模式[, 重复标志]])
; 参数: 重复标志 - [可选],有些inf文件会有重复的字段名,设置此标志为1时可读取所有内容。
; 返回值:成功: 返回字段中的所有字符。
; 失败: 返回0。如INI文件读取错误或字段不存在将设置 @error=1;字段内容为空将设置 @error=2
;==========================================================================================start
Func _IniReadSection_str($iFile, $Section, $mode = 0, $nFlag = 0)
Local $s_File = _FileRead($iFile, $mode), $line_all
Local $_Section = StringRegExpReplace($Section, '^\h*|\h*, '')
Local $s_Sec = StringRegExp($s_File, '(?si)(?:^|\n)\h*\[\h*\Q' & $_Section & '\E\h*\](.+?)(?=\r?\n\h*\[|$)', 3)
If @error Then Return SetError(1, 0, 0)
$line_all = $s_Sec[0]
If $nFlag Then
For $i = 1 To UBound($s_Sec) - 1
$line_all &= $s_Sec[$i]
Next
Endif
If Not StringRegExp($line_all, '\V') Then Return SetError(2, 0, 0)
Return $line_all
EndFunc ;==>_IniReadSection_str
; 函数名:_IniDelete_line;=============================================================================
; 说明: 从(非)标准INI结构文件中删除(含有)关键字的行。
; 语法: _IniDelete_line('ini文件路径', '字段名', '关键字'[, 匹配标志[, 打开模式]])
; 参数: 可选参数 匹配标志,= 0 含有要删除的关键字(默认); = 1 完整匹配关键字。
; 返回值:成功: 返回1。
; 失败: 返回0。并设置 @Error 为以下值:
; @Error=1 文件或字段不存在;
; @Error=3 根据匹配标志未匹配到关键字(不存在);
; @Error=4 文件具有只读属性或者无法写入数据设置。
; 注意: 该函数仅执行一次删除行,如有多行(含有)关键字的行需要删除,可多次执行。
;==========================================================================================start
Func _IniDelete_line($iFile, $Section, $key, $flag = 0, $mode = 0)
Local $s_File = _FileRead($iFile, $mode)
Local $_Section = StringRegExpReplace($Section, '^\h*(.+?)\h*, '$1')
$_Section = StringRegExpReplace($_Section, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1')
$_Section = '\[\h*' & $_Section & '\h*\]'
If Not StringRegExp(@CRLF & $s_File, '\r?\n\h*' & $_Section & '\s*') Then Return SetError(1, 0, 0)
Local $_key = StringRegExpReplace($key, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')
If $flag = 0 Then $_key = '[^\r?\n]*?' & $_key & '.*?'
Local $s_data = StringRegExpReplace(@CRLF & $s_File & @CRLF, '(?si)(.*?\r?\n\h*' & $_Section & '\h*\r?\n(?:\h*[^\[\r\n]*\r?\n)*?)' & $_key & '\r?\n(.*)', '${1}$2')
If @Extended = 0 Then Return SetError(3, 0, 0)
$s_data = StringTrimRight(StringTrimLeft($s_data, 2), 2)
Local $FO = FileOpen($iFile, $mode + 2)
Local $Write = FileWrite($FO, $s_data)
FileClose($FO)
If $Write = 0 Then Return SetError(4, 0, 0)
Return 1
EndFunc ;==>_IniDelete_line
以上代码是根据afan老师的函数东拼西凑出来的,目前对以上格式配置文件的读取、添加一行已实现;但删除、修改一行还无法实现,在这儿求助各位老师、特别是afan老师的指点!