非标ini文件的写操作[已解决]
本帖最后由 redapple2008 于 2021-4-7 08:46 编辑例如:
www.ljbaidu.com
www.autoitx.com
127.0.0.1
192.168.1.1
像这种的配置文件,怎么修改?删除或者改写操作?
本帖最后由 yuantian 于 2021-4-2 00:10 编辑
IniReadSection() ??
不对,这个只是读取、、、
你可以学习一下A版大大改进的INI的UDF
代码放上来容易丢, 你看这里吧
https://www.autoitx.com/thread-12319-1-1.html
是啊!都到了,想想怎么删写? redapple2008 发表于 2021-4-2 12:22
是啊!都到了,想想怎么删写?
读取显示在GUICtrlCreateEdit控件后修改
chzj589 发表于 2021-4-4 10:18
读取显示在GUICtrlCreateEdit控件后修改
怎么删除?或者改写? redapple2008 发表于 2021-4-4 20:40
怎么删除?或者改写?
编辑框里修改或添加后保存 chzj589 发表于 2021-4-4 21:29
编辑框里修改或添加后保存
有代码吗?给我参考一下,谢谢! 先将非标准ini转换成内置函数可以处理的格式。
处理完毕后再转换回去。
可以这样:
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
Global $FilePath = @ScriptDir&"\setup.ini"
If FileExists($FilePath) Then FileDelete($FilePath)
;写入实例
IniWrite($FilePath, "www", "www.ljbaidu.com", "")
IniWrite($FilePath, "www", "www.autoitx.com", "")
IniWrite($FilePath, "ip", "127.0.0.1", "")
IniWrite($FilePath, "ip", "192.168.1.1", "")
_ini_to_file($FilePath)
;显示非标准ini实例
ShellExecute($FilePath)
Sleep(2000)
_file_to_ini($FilePath);转换到标准
IniDelete($FilePath, "www", "www.ljbaidu.com")
IniDelete($FilePath, "ip", "192.168.1.1")
IniWrite($FilePath, "ip", "192.168.100.1", "")
IniWrite($FilePath, "www", "www.163.com", "")
IniWrite($FilePath, "www", "www.qq.com", "")
_ini_to_file($FilePath);转换到非标准
ShellExecute($FilePath)
Func _file_to_ini($sFilePath)
If Not FileExists($sFilePath) Then Return False
Local $aArray = FileReadToArray($sFilePath)
Local $iLineCount = @extended
If @error Then
MsgBox($MB_SYSTEMMODAL, "", "读取文件时出现错误. @error: " & @error) ; 读取当前脚本文件时发生错误.
Else
For $i = 0 To $iLineCount - 1 ; 遍历数组. 也可以使用 UBound($aArray).
$temp = StringStripWS ( $aArray[$i], 3 )
If $temp <> "" Then
If StringLeft ( $temp, 1 ) == "[" and StringRight ( $temp, 1 ) == "]" Then
Else
$aArray[$i] &= "="
EndIf
EndIf
Next
If FileExists($sFilePath) Then FileDelete($sFilePath)
For $i = 0 To $iLineCount - 1
FileWriteLine($sFilePath, $aArray[$i])
Next
EndIf
EndFunc ;==>Example
Func _ini_to_file($sFilePath)
If Not FileExists($sFilePath) Then Return False
Local $aArray = FileReadToArray($sFilePath)
Local $iLineCount = @extended
If @error Then
MsgBox($MB_SYSTEMMODAL, "", "读取文件时出现错误. @error: " & @error) ; 读取当前脚本文件时发生错误.
Else
For $i = 0 To $iLineCount - 1 ; 遍历数组. 也可以使用 UBound($aArray).
$temp = StringStripWS ( $aArray[$i], 3 )
If $temp <> "" Then
If StringLeft ( $temp, 1 ) == "[" and StringRight ( $temp, 1 ) == "]" Then
Else
If StringRight ( $aArray[$i], 1 ) == "=" Then $aArray[$i] = StringTrimRight ( $aArray[$i], 1 )
EndIf
EndIf
Next
If FileExists($sFilePath) Then FileDelete($sFilePath)
For $i = 0 To $iLineCount - 1
FileWriteLine($sFilePath, $aArray[$i])
Next
EndIf
EndFunc ;==>Example
本帖最后由 chzj589 于 2021-4-5 09:17 编辑
redapple2008 发表于 2021-4-4 21:39
有代码吗?给我参考一下,谢谢!
既然j是非标ini文件,就用读取写入修改删除TXT操作,读取显示编辑框,写入修改删除后保存
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1)
Global $Form1, $Edit1
Example()
While 1
Sleep(1000)
WEnd
Func Example()
$Form1 = GUICreate("Form1", 270, 264, -1, -1);193, 125)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Form1Close")
;$Input1 = GUICtrlCreateInput('', 10, 18, 215, 21)
$Button1 = GUICtrlCreateButton("保 存", 150, 215, 75, 23)
GUICtrlSetOnEvent($Button1, "_Button1")
$Edit1 = GUICtrlCreateEdit("", 10, 18, 249, 190);, $ES_READONLY)
GUISetState(@SW_SHOW, $Form1)
_Edit1()
EndFunc ;==>Example
Func _Form1Close()
GUIDelete()
Exit
EndFunc ;==>_Form1Close
Func _Button1()
_AddFilec()
EndFunc ;==>_Button1
Func _Edit1();添加读取
If FileExists(@ScriptDir & "\22.ini") Then
$sTexts = @ScriptDir & "\22.ini"
GUICtrlSetData($Edit1, Readtxte(), "")
Else
MsgBox(4096, "文件", "22.ini 不文件存在")
EndIf
EndFunc ;==>_Edit1
Func Readtxte()
$sTexts = @ScriptDir & "\22.ini"
$SEARCHa = $sTexts
Global $Files = $SEARCHa
Local $txt, $temp
$temp = FileOpen($Files, 0)
$txt = FileRead($temp)
FileClose($temp)
Return $txt
GUICtrlSetData($Edit1, $temp)
EndFunc ;==>Readtxte
Func _AddFilec();另存
Readtxteab();
$yj1 = GUICtrlRead($Edit1)
$var = @ScriptDir & "\22.ini"
FileDelete($var)
$File = FileOpen($var, 1)
FileWrite($File, "" & $yj1 & @CRLF)
FileClose($File)
ShellExecute($var)
_Edit1()
EndFunc ;==>_AddFilec
Func Readtxteab()
$sTexts = GUICtrlRead($Edit1)
$SEARCH = $sTexts
Global $Files = $sTexts
Local $txt, $temp
$temp = FileOpen($Files, 0)
$txt = FileRead($temp)
FileClose($temp)
Return $txt
EndFunc ;==>Readtxteab
十分感谢上面两位,我先研究一下
刚动了下脑,我也来份我实现的UDF吧。
利用 分割和替换 的方法
#include <String.au3>
#include <array.au3>
;读取 非标文件中的字段名
Func _oIniReadName($_md)
Local $str = FileRead($_md);读取文件
If @extended < 2 Then Return -2 ;读取文件失败
Local $arr = _StringBetween($str, '[', ']');取两字符 串间的内容
Return $arr ;返回一个基于0开始计算的一维数组, $array 包含第一个找到的内容.
EndFunc ;==>_oIniReadName
;读取 非标文件中的 所有的键
Func _oIniReadALL($_md, $_name)
Local $str = FileRead($_md);读取文件
If @extended < 2 Then Return -2 ;读取文件失败
Local $arr = _StringBetween($str & '[', '[' & $_name & ']', '[') ;取两字符 串间的内容
If $arr = 0 Then Return 0;返回0 获取 失败
$str = StringRegExpReplace($arr, '^\v+|\v+(?=\r\n\V|$)', '') ;清掉空行
Return StringSplit($str, @CRLF, 1) ;返回 一个所有键的数组
EndFunc ;==>_oIniReadALL
;删除 非标文件中的 字段名
Func _oIniDelName($_md, $_name)
Local $str = FileRead($_md);读取文件
If @extended < 2 Then Return -2 ;读取文件失败
Local $arr = _StringBetween($str & '[', '[' & $_name & ']', '[') ;取两字符 串间的内容
If $arr = 0 Then Return 0;返回0 没有这个字段 名
$str = StringReplace($str, '[' & $_name & ']' & $arr, "")
Local $file = FileOpen($_md, 2)
FileWrite($file, $str)
FileClose($file)
Return ;
EndFunc ;==>_oIniDelName
;删除或添加 非标文件中的 键
;参数 $_md 文件
; $_name 字段名
; $_var 键名
;$add = 0 添加 键名, = 1 删除键名
Func _oIniDelNameVer($_md, $_name, $_var, $add = 0)
Local $str = FileRead($_md);读取文件
If @extended < 2 Then Return -2 ;读取文件失败
Local $arr = _StringBetween($str & '[', '[' & $_name & ']', '[') ;取两字符 串间的内容
If $arr = 0 Then Return 0;返回0 没有这个字段 名
If $add = 0 Then ;删除
Local $strl = StringReplace($arr & @CRLF, @CRLF & $_var & @CRLF, @CRLF)
If @extended < 1 Then Return -1;返回 -1 没有这个键
Else ;$add = 其它值添加
Local $strl = StringReplace($arr & @CRLF, @CRLF & $_var & @CRLF, @CRLF)
If @extended > 0 Then Return -11;返回 -11 已有这个键
$strl = $arr&@crlf&$_var&@CRLF ;这里漏掉一个回车。
EndIf
$str = StringReplace($str, '[' & $_name & ']' & $arr, '[' & $_name & ']' & $strl)
Local $file = FileOpen($_md, 2)
FileWrite($file, StringRegExpReplace($str, '^\v+|\v+(?=\r\n\V|$)', ''));清掉空行
FileClose($file)
Return 1;成功返回1
EndFunc ;==>_oIniDelNameVer
绿色风 发表于 2021-4-6 20:38
刚动了下脑,我也来份我实现的UDF吧。
利用 分割和替换 的方法
这个写的很祥细,解决了我的问题。注解也不错。谢谢了。 绿色风 发表于 2021-4-6 20:38
刚动了下脑,我也来份我实现的UDF吧。
利用 分割和替换 的方法
不错。测试发现多个字段名添加键名会出现下个字段名与键名合在一起
chzj589 发表于 2021-4-7 12:10
不错。测试发现多个字段名添加键名会出现下个字段名与键名合在一起
......
Else ;$add = 其它值添加
Local $strl = StringReplace($arr & @CRLF, @CRLF & $_var & @CRLF, @CRLF)
If @extended > 0 Then Return -11;返回 -11 已有这个键
$strl = $arr&@crlf&$_var&@CRLF ;这里漏掉一个回车。 加上就OK
EndIf
... 绿色风 发表于 2021-4-7 15:32
......
Else ;$add = 其它值添加
Local $strl = StringReplace($arr & @C ...
是的,我在
$str = StringReplace($str, '[' & $_name & ']' & $arr, '[' & $_name & ']' & $strl & @CRLF)
;加一个回车。 OK
页:
[1]
2