找回密码  加入

AUTOIT CN

搜索
查看: 283|回复: 14

[AU3基础] 非标ini文件的写操作[已解决]

[复制链接]
发表于 2021-4-1 22:17:38 | 显示全部楼层 |阅读模式
本帖最后由 redapple2008 于 2021-4-7 08:46 编辑

例如:
[www]
www.ljbaidu.com
www.autoitx.com
[ip]
127.0.0.1
192.168.1.1
像这种的配置文件,怎么修改?删除或者改写操作?
发表于 2021-4-2 00:02:23 | 显示全部楼层
本帖最后由 yuantian 于 2021-4-2 00:10 编辑

IniReadSection()   ??
不对,这个只是读取、、、

你可以学习一下A版大大改进的INI的UDF

代码放上来容易丢, 你看这里吧
https://www.autoitx.com/thread-12319-1-1.html
 楼主| 发表于 2021-4-2 12:22:20 来自手机 | 显示全部楼层
是啊!都到了,想想怎么删写?
发表于 2021-4-4 10:18:07 | 显示全部楼层
redapple2008 发表于 2021-4-2 12:22
是啊!都到了,想想怎么删写?

读取显示在GUICtrlCreateEdit控件后修改

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入

x
 楼主| 发表于 2021-4-4 20:40:19 | 显示全部楼层
chzj589 发表于 2021-4-4 10:18
读取显示在GUICtrlCreateEdit控件后修改

怎么删除?或者改写?
发表于 2021-4-4 21:29:14 | 显示全部楼层
redapple2008 发表于 2021-4-4 20:40
怎么删除?或者改写?

编辑框里修改或添加后保存
 楼主| 发表于 2021-4-4 21:39:52 | 显示全部楼层
chzj589 发表于 2021-4-4 21:29
编辑框里修改或添加后保存

有代码吗?给我参考一下,谢谢!
发表于 2021-4-5 01:09:27 | 显示全部楼层
先将非标准ini转换成内置函数可以处理的格式。
处理完毕后再转换回去。
可以这样:
  1. #include <MsgBoxConstants.au3>
  2. #include <FileConstants.au3>
  3. Global $FilePath = @ScriptDir&"\setup.ini"
  4. If FileExists($FilePath) Then FileDelete($FilePath)
  5. ;写入实例
  6. IniWrite($FilePath, "www", "www.ljbaidu.com", "")
  7. IniWrite($FilePath, "www", "www.autoitx.com", "")
  8. IniWrite($FilePath, "ip", "127.0.0.1", "")
  9. IniWrite($FilePath, "ip", "192.168.1.1", "")



  10. _ini_to_file($FilePath)
  11. ;显示非标准ini实例
  12. ShellExecute($FilePath)
  13. Sleep(2000)
  14. _file_to_ini($FilePath);转换到标准
  15. IniDelete($FilePath, "www", "www.ljbaidu.com")
  16. IniDelete($FilePath, "ip", "192.168.1.1")
  17. IniWrite($FilePath, "ip", "192.168.100.1", "")
  18. IniWrite($FilePath, "www", "www.163.com", "")
  19. IniWrite($FilePath, "www", "www.qq.com", "")
  20. _ini_to_file($FilePath);转换到非标准
  21. ShellExecute($FilePath)

  22. Func _file_to_ini($sFilePath)
  23. If Not FileExists($sFilePath) Then Return False
  24.     Local $aArray = FileReadToArray($sFilePath)
  25.     Local $iLineCount = @extended
  26.     If @error Then
  27.         MsgBox($MB_SYSTEMMODAL, "", "读取文件时出现错误. @error: " & @error) ; 读取当前脚本文件时发生错误.
  28.     Else
  29.         For $i = 0 To $iLineCount - 1 ; 遍历数组. 也可以使用 UBound($aArray).
  30.                         $temp = StringStripWS ( $aArray[$i], 3 )
  31.                         If $temp <> "" Then
  32.                         If StringLeft ( $temp, 1 ) == "[" and StringRight ( $temp, 1 ) == "]" Then
  33.                         Else
  34.                                 $aArray[$i] &= "="
  35.                                 EndIf
  36.                         EndIf
  37.         Next
  38.                  If FileExists($sFilePath) Then FileDelete($sFilePath)
  39.                  For $i = 0 To $iLineCount - 1
  40.                 FileWriteLine($sFilePath, $aArray[$i])
  41.                 Next
  42.     EndIf
  43. EndFunc   ;==>Example

  44. Func _ini_to_file($sFilePath)
  45. If Not FileExists($sFilePath) Then Return False
  46.     Local $aArray = FileReadToArray($sFilePath)
  47.     Local $iLineCount = @extended
  48.     If @error Then
  49.         MsgBox($MB_SYSTEMMODAL, "", "读取文件时出现错误. @error: " & @error) ; 读取当前脚本文件时发生错误.
  50.     Else
  51.         For $i = 0 To $iLineCount - 1 ; 遍历数组. 也可以使用 UBound($aArray).
  52.                         $temp = StringStripWS ( $aArray[$i], 3 )
  53.                         If $temp <> "" Then
  54.                         If StringLeft ( $temp, 1 ) == "[" and StringRight ( $temp, 1 ) == "]" Then
  55.                         Else
  56.                                 If StringRight ( $aArray[$i], 1 ) == "=" Then   $aArray[$i] = StringTrimRight ( $aArray[$i], 1 )
  57.                                 EndIf
  58.                         EndIf
  59.         Next
  60.                  If FileExists($sFilePath) Then FileDelete($sFilePath)
  61.                  For $i = 0 To $iLineCount - 1
  62.                 FileWriteLine($sFilePath, $aArray[$i])
  63.                 Next
  64.     EndIf
  65. EndFunc   ;==>Example
复制代码


发表于 2021-4-5 09:12:46 | 显示全部楼层
本帖最后由 chzj589 于 2021-4-5 09:17 编辑
redapple2008 发表于 2021-4-4 21:39
有代码吗?给我参考一下,谢谢!

复制代码
既然j是非标ini文件,就用读取写入修改删除TXT操作,读取显示编辑框,写入修改删除后保存

  1. #include <EditConstants.au3>
  2. #include <GUIConstantsEx.au3>
  3. #include <WindowsConstants.au3>
  4. #include <Array.au3>
  5. Opt("GUIOnEventMode", 1)
  6. Global $Form1, $Edit1
  7. Example()
  8. While 1
  9.         Sleep(1000)
  10. WEnd
  11. Func Example()
  12.         $Form1 = GUICreate("Form1", 270, 264, -1, -1);193, 125)
  13.         GUISetOnEvent($GUI_EVENT_CLOSE, "_Form1Close")
  14.         ;$Input1 = GUICtrlCreateInput('', 10, 18, 215, 21)
  15.         $Button1 = GUICtrlCreateButton("保 存", 150, 215, 75, 23)
  16.         GUICtrlSetOnEvent($Button1, "_Button1")
  17.         $Edit1 = GUICtrlCreateEdit("", 10, 18, 249, 190);, $ES_READONLY)
  18.         GUISetState(@SW_SHOW, $Form1)
  19.         _Edit1()
  20. EndFunc   ;==>Example
  21. Func _Form1Close()
  22.         GUIDelete()
  23.         Exit
  24. EndFunc   ;==>_Form1Close
  25. Func _Button1()
  26.         _AddFilec()
  27. EndFunc   ;==>_Button1
  28. Func _Edit1();添加读取
  29.         If FileExists(@ScriptDir & "\22.ini") Then
  30.                 $sTexts = @ScriptDir & "\22.ini"
  31.                 GUICtrlSetData($Edit1, Readtxte(), "")
  32.         Else
  33.                 MsgBox(4096, "文件", "22.ini 不文件存在")
  34.         EndIf
  35. EndFunc   ;==>_Edit1
  36. Func Readtxte()
  37.         $sTexts = @ScriptDir & "\22.ini"
  38.         $SEARCHa = $sTexts
  39.         Global $Files = $SEARCHa
  40.         Local $txt, $temp
  41.         $temp = FileOpen($Files, 0)
  42.         $txt = FileRead($temp)
  43.         FileClose($temp)
  44.         Return $txt
  45.         GUICtrlSetData($Edit1, $temp)
  46. EndFunc   ;==>Readtxte
  47. Func _AddFilec();另存
  48.         Readtxteab();
  49.         $yj1 = GUICtrlRead($Edit1)
  50.         $var = @ScriptDir & "\22.ini"
  51.         FileDelete($var)
  52.         $File = FileOpen($var, 1)
  53.         FileWrite($File, "" & $yj1 & @CRLF)
  54.         FileClose($File)
  55.         ShellExecute($var)
  56.         _Edit1()
  57. EndFunc   ;==>_AddFilec
  58. Func Readtxteab()
  59.         $sTexts = GUICtrlRead($Edit1)
  60.         $SEARCH = $sTexts
  61.         Global $Files = $sTexts
  62.         Local $txt, $temp
  63.         $temp = FileOpen($Files, 0)
  64.         $txt = FileRead($temp)
  65.         FileClose($temp)
  66.         Return $txt
  67. EndFunc   ;==>Readtxteab
复制代码


 楼主| 发表于 7 天前 | 显示全部楼层
十分感谢上面两位,我先研究一下
发表于 7 天前 | 显示全部楼层


刚动了下脑,我也来份我实现的UDF吧。

     利用 分割和替换 的方法




  1. #include <String.au3>
  2. #include <array.au3>


  3. ;读取 非标文件中的  字段名
  4. Func _oIniReadName($_md)
  5.         Local $str = FileRead($_md);读取文件
  6.         If @extended < 2 Then Return -2 ;读取文件失败
  7.         Local $arr = _StringBetween($str, '[', ']');取两字符 串间的内容
  8.         Return $arr ;返回一个基于0开始计算的一维数组, $array[0] 包含第一个找到的内容.
  9. EndFunc   ;==>_oIniReadName

  10. ;读取 非标文件中的 所有的键
  11. Func _oIniReadALL($_md, $_name)
  12.         Local $str = FileRead($_md);读取文件
  13.         If @extended < 2 Then Return -2 ;读取文件失败
  14.         Local $arr = _StringBetween($str & '[', '[' & $_name & ']', '[') ;取两字符 串间的内容
  15.         If $arr = 0 Then Return 0;返回0 获取 失败
  16.         $str = StringRegExpReplace($arr[0], '^\v+|\v+(?=\r\n\V|$)', '') ;清掉空行
  17.         Return StringSplit($str, @CRLF, 1) ;返回 一个所有键的数组
  18. EndFunc   ;==>_oIniReadALL

  19. ;删除 非标文件中的 字段名
  20. Func _oIniDelName($_md, $_name)
  21.         Local $str = FileRead($_md);读取文件
  22.         If @extended < 2 Then Return -2 ;读取文件失败
  23.         Local $arr = _StringBetween($str & '[', '[' & $_name & ']', '[') ;取两字符 串间的内容
  24.         If $arr = 0 Then Return 0;返回0 没有这个字段 名
  25.         $str = StringReplace($str, '[' & $_name & ']' & $arr[0], "")
  26.         Local $file = FileOpen($_md, 2)
  27.         FileWrite($file, $str)
  28.         FileClose($file)
  29.         Return ;
  30. EndFunc   ;==>_oIniDelName


  31. ;删除或添加 非标文件中的 键
  32. ;参数 $_md 文件
  33. ;        $_name 字段名
  34. ;   $_var 键名
  35. ;  $add = 0 添加 键名, = 1 删除键名
  36. Func _oIniDelNameVer($_md, $_name, $_var, $add = 0)
  37.         Local $str = FileRead($_md);读取文件
  38.         If @extended < 2 Then Return -2 ;读取文件失败
  39.         Local $arr = _StringBetween($str & '[', '[' & $_name & ']', '[') ;取两字符 串间的内容
  40.         If $arr = 0 Then Return 0;返回0 没有这个字段 名
  41.         If $add = 0 Then ;删除
  42.                 Local $strl = StringReplace($arr[0] & @CRLF, @CRLF & $_var & @CRLF, @CRLF)
  43.                 If @extended < 1 Then Return -1;返回 -1 没有这个键
  44.         Else ;$add = 其它值  添加
  45.                 Local $strl = StringReplace($arr[0] & @CRLF, @CRLF & $_var & @CRLF, @CRLF)
  46.                 If @extended > 0 Then Return -11;返回 -11 已有这个键
  47.                 $strl = $arr[0]&@crlf&$_var&@CRLF ;这里漏掉一个回车。
  48.         EndIf
  49.         $str = StringReplace($str, '[' & $_name & ']' & $arr[0], '[' & $_name & ']' & $strl)
  50.         Local $file = FileOpen($_md, 2)
  51.         FileWrite($file, StringRegExpReplace($str, '^\v+|\v+(?=\r\n\V|$)', ''));清掉空行
  52.         FileClose($file)
  53.         Return 1;成功返回1
  54. EndFunc   ;==>_oIniDelNameVer



复制代码


 楼主| 发表于 6 天前 | 显示全部楼层
绿色风 发表于 2021-4-6 20:38
刚动了下脑,我也来份我实现的UDF吧。

     利用 分割和替换 的方法

这个写的很祥细,解决了我的问题。注解也不错。谢谢了。
发表于 6 天前 | 显示全部楼层
绿色风 发表于 2021-4-6 20:38
刚动了下脑,我也来份我实现的UDF吧。

     利用 分割和替换 的方法

不错。测试发现多个字段名添加键名会出现下个字段名与键名合在一起

评分

参与人数 1金钱 +50 贡献 +1 收起 理由
绿色风 + 50 + 1 已解决

查看全部评分

发表于 6 天前 | 显示全部楼层
chzj589 发表于 2021-4-7 12:10
不错。测试发现多个字段名添加键名会出现下个字段名与键名合在一起

......
      Else ;$add = 其它值  添加
                Local $strl = StringReplace($arr[0] & @CRLF, @CRLF & $_var & @CRLF, @CRLF)
                If @extended > 0 Then Return -11;返回 -11 已有这个键
                $strl = $arr[0]&@crlf&$_var&@CRLF ;这里漏掉一个回车。 加上就OK
        EndIf
...
发表于 6 天前 | 显示全部楼层
绿色风 发表于 2021-4-7 15:32
......
      Else ;$add = 其它值  添加
                Local $strl = StringReplace($arr[0] & @C ...

是的,我在
$str = StringReplace($str, '[' & $_name & ']' & $arr[0], '[' & $_name & ']' & $strl & @CRLF)
;加一个回车。 OK
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|小黑屋|手机版|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2021-4-13 06:43 , Processed in 0.156250 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表