找回密码
 加入
搜索
楼主: sfwd001

ini配置文件的读取

  [复制链接]
发表于 2009-3-2 13:51:32 | 显示全部楼层
$a = '[abcd]' & @CRLF & 'a.ipshougou.com=机器狗病毒存放主机2008/12/1' & @CRLF & _
                'b.ipshougou.com=机器狗病毒存放主机2008/12/1' & @CRLF & 'www.biaoqing365.cn=机器狗病毒存放主机2008/12/1' & _
                @CRLF & 'qq.icafe88.cn=机器狗病毒存放主机2008/12/1' & @CRLF & 'www.qq808a.cn=钓鱼网2008/12/1' & @CRLF
MsgBox(0,0,$a)
$a = StringRegExp($a, '\w+\.\w+\.\w+', 3, 1)
$b = ''
For $i = 0 To UBound($a) - 1
        $b &= $a[$i] & @CRLF
Next
MsgBox(0,0, $b)
 楼主| 发表于 2009-3-3 09:55:37 | 显示全部楼层
感谢各位网友热心的帮助支持!
原思路是这样的,有一个配置文件 ProcessSafe.ini 里内有很多参数设置,其中就有一个自动从网上更新的恶性非法网站(已经收录有3千多个网站),客户机需要从这个配置文件 ProcessSafe.ini 中读出需要屏蔽的网站到本机hosts文件中。
我按照 KiwiCsj  网友的程序修改成功了,但是这个程序只能读取1015行内容,还有2千多个行的内容没有读出!

ProcessSafe.ini 配置文件中需要屏蔽网站的内容格式

[Local_HostsDeny]
a.ipshougou.com=机器狗病毒存放主机2008/12/1
b.ipshougou.com=机器狗病毒存放主机2008/12/1
www.biaoqing365.cn=机器狗病毒存放主机2008/12/1
qq.icafe88.cn=机器狗病毒存放主机2008/12/1
www.qq808a.cn=钓鱼网2008/12/1
.................


我按照 KiwiCsj  网友提供修改的程序
Local $var,$tmp_str,$file,$dt
$dt="ProcessSafe.ini"
$file="hosts"
$var = IniReadSection($dt, "Local_HostsDeny")
If @error <> 1 Then
For $i=1 to $var[0][0]
$tmp_str&=@CRLF&"127.0.0.1 "&$var[$i][0]
Next
FileWrite($file,$tmp_str)
Else
MsgBox(4096, "结果", "没有找到")
EndIf
;FileWrite($file,@CRLF)
;FileClose($file)
MsgBox(0, "提示", "文件提取成功!")

现请各位网友再次帮助修改这个程序,让他可以读出3千多条记录,谢谢!

[ 本帖最后由 sfwd001 于 2009-3-3 09:58 编辑 ]
发表于 2009-3-3 15:52:31 | 显示全部楼层
将所有的数据放在一个文本里,再定义一些特征数字,比如1代表机器狗病毒存放主机,2代表是钓鱼网,以此类推。然后一行表示一条记录,记录子项间使用“,”分割,如:
a.ipshougou.com,1,2008/12/1
b.ipshougou.com,1,2008/12/1
www.biaoqing365.cn,1,2008/12/1
qq.icafe88.cn,1,2008/12/1
www.qq808a.cn,2,2008/12/1

然后写个函数对此文本文件的内容进行解读并写入到一个2维数组中返回。如下:

#include <file.au3>

Func GetDataFromTxt($strFilePath)
        Local $aRecords;
        
        If Not _FileReadToArray($strFilePath, $aRecords) Then
                MsgBox(4096, "Error", " Error reading log to Array   error:" & @error)
                Return
        EndIf
        
        If (Not IsArray($aRecords)) Or $aRecords[0] = 0 Then
                MsgBox(4096, "Error", $strFilePath & " is a empty file.")
                Return
        EndIf
        
        ;定义新数组存储分割后的数据
        Local $aRecordSplt[$aRecords[0]+1][3];
        $aRecordSplt[0][0] = $aRecords[0]
        Local $aRecTemp;
        Local $iRecIndex = 1, $iStrIndex = 1;
        
        For $iRecIndex = 1 To $aRecords[0]
                $aRecTemp = StringSplit($aRecords[$iRecIndex], ",")        ;分割字符串
                ;将分割后的数组各项赋给多维数组
                If $aRecTemp[0] > 0 Then
                        
                        For $iStrIndex = 1 To $aRecTemp[0]
                                $aRecordSplt[$iRecIndex][$iStrIndex-1] = $aRecTemp[$iStrIndex]
                        Next
                        
                EndIf
                
        Next
        
        Return $aRecordSplt
EndFunc
 楼主| 发表于 2009-3-4 10:29:10 | 显示全部楼层
感谢firewzy 网友的回复和程序,有一点需要指出,ProcessSafe.ini 配置文件是不可修改的
发表于 2009-3-4 12:02:23 | 显示全部楼层
这个问题还没解决??
狮子的方法可以用啊,读文件用fileread或filereadline就可以了
 楼主| 发表于 2009-3-4 15:38:57 | 显示全部楼层
不好意思,这个问题目前还是没有解决!
发表于 2009-3-4 18:30:38 | 显示全部楼层

#include <array.au3>
Dim $arrIniHosts = GetDataFromIni("c:\test.ini")

If IsArray($arrIniHosts) Then
        _ArrayDisplay($arrIniHosts)
EndIf

Func GetDataFromIni($strIniPath)
        ;判断文件是否存在,若不存在则返回FALSE
        If Not FileExists($strIniPath) Then Return False
        
        ;打开文件
        Local $fIniFileRead = FileOpen($strIniPath, 0)
        
        ;找到[Local_HostsDeny]所在的位置
        Local $strLine = ""
        
        While 1
                $strLine = FileReadLine($fIniFileRead)
                If @error Then Return False                ;如果读行失败,则返回FALSE
                If StringStripWS($strLine, 3) = "[Local_HostsDeny]" Then ExitLoop
        Wend
        
        ;读取[Local_HostsDeny]下的各行,直到遇到下一个字段名
        Local $arrHosts[1][2] = [[0, 0]]        ;定义存储INI中网址与网址类型的数组
        Local $iEqualPos = 0                        ;定义等于号所在的位置变量
        Local $iArrayUbound = 0                        ;定义数组维数
        
        While 1
                $strLine = FileReadLine($fIniFileRead)
                If @error Then ExitLoop                                        ;如果读行失败,则退出循环
                $strLine = StringStripWS($strLine, 3)        ;删除字符串开始与末尾的空格
                If StringInStr($strLine, "[") > 0 And StringInStr($strLine, "]") > 0 Then ExitLoop        ;如果发现[]中括号则表示找到下一个字段名,则退出循环
                $iEqualPos = StringInStr($strLine, "=")        ;查找等于号=的位置
                If $iEqualPos = 0 Then ContinueLoop                ;如果没有找到等于号=,则继续读取下一行
                $iArrayUbound = UBound($arrHosts)
                ReDim $arrHosts[$iArrayUbound+1][2]                ;重新定义数组大小
                $arrHosts[$iArrayUbound][0] = StringLeft($strLine, $iEqualPos-1)        ;将等于号=前面的字符串赋给数组的第一维
                $arrHosts[$iArrayUbound][1] = StringMid($strLine, $iEqualPos+1)                ;将等于号=后面的字符串赋给数组的第二维
        WEnd
        
        $arrHosts[0][0] = UBound($arrHosts) - 1
        Return $arrHosts
EndFunc


----------------------"c:\test.ini"---------------------------
[Local_HostsDeny1]


[Local_HostsDeny]
a.ipshougou.com=机器狗病毒存放主机2008/12/1
b.ipshougou.com=机器狗病毒存放主机2008/12/1
www.biaoqing365.cn=机器狗病毒存放主机2008/12/1
qq.icafe88.cn=机器狗病毒存放主机2008/12/1
www.qq808a.cn=钓鱼网2008/12/1


[Local_HostsDeny2]

----------------------"c:\test.ini"---------------------------

[ 本帖最后由 firewzy 于 2009-3-4 18:32 编辑 ]

本帖子中包含更多资源

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

×
 楼主| 发表于 2009-3-5 12:54:13 | 显示全部楼层
原帖由 firewzy 于 2009-3-4 18:30 发表
[au3]
#include
Dim $arrIniHosts = GetDataFromIni("c:\test.ini")

If IsArray($arrIniHosts) Then
        _ArrayDisplay($arrIniHosts)
EndIf

Func GetDataFromIni($strIniPath)
        ;判断文件是否存在,若不存 ...



再次感谢firewzy 的回复程序,可是,不好意思,您的程序无法运行,如果把第五行的内容变成这样        _ArrayDisplay($arrIniHosts,"ok") 则可以运行下去,但没有结果,消息框内出现以下红色提示:
C:\PROGRA~1\AutoIt3\Include\array.au3 (176) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$sMsg = $sMsg & "[" & $iCounter & "]    = " & StringStripCR($avArray[$iCounter]) & @CR
$sMsg = $sMsg & "[" & $iCounter & "]    = " & StringStripCR(^ ERROR


------------------------------------------------------------
是不是我的这个编译程序的问题?我的版本:
SciTE
版本号: 1.72
    Jan 15 2007 21:43:31
作者: Neil Hodgson.
December 1998-January 2007.
http://www.scintilla.org
Lua scripting language by TeCGraf, PUC-Rio
    http://www.lua.org
2004年10月02日本地化。版本号:1.61
本地化: konan
感谢riverofchina对1.54版的汉化
---------------------------------------------------------------------

[ 本帖最后由 sfwd001 于 2009-3-5 13:07 编辑 ]
发表于 2009-3-5 17:11:35 | 显示全部楼层
学习一下。
发表于 2009-3-5 17:28:14 | 显示全部楼层
还真是自己不想

全靠大家啊
发表于 2009-3-5 18:57:13 | 显示全部楼层
把ini文件发上来吧
发表于 2009-3-5 20:10:48 | 显示全部楼层
pcbar的建议不错,在自己这先试一下,别到时候又出错
 楼主| 发表于 2009-3-9 18:35:09 | 显示全部楼层
感谢各位网友热心的回复,ProcessSafe.ini配置文件已经上传,请网友改名为ini文件就可以了。

本帖子中包含更多资源

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

×
发表于 2009-3-9 22:21:54 | 显示全部楼层
$file = @ScriptDir & "\ProcessSafe.ini"
$filew = @ScriptDir & "\out.txt"
$n = 0
$m=_FileCountLines($file)
$fh = FileOpen($file, 0)
$fhw = FileOpen($filew, 2)
ProgressOn("正在处理...","正在处理第  行")
While 1
        $n += 1
        $line = FileReadLine($fh)
        If @error = -1 Then ExitLoop
        $b = StringRegExp($line, "(\w+\.)+\w+", 2)
        If IsArray($b) Then FileWrite($fhw, $b[0]&@CRLF);如查不需要Local_ProcessDeny段,在此处加上判断
        ProgressSet(Ceiling($n/$m*100),"正在提取:"&$line,"正在处理第"&$n&"行")
WEnd
FileClose($fh)
FileClose($fhw)
ProgressOff()
ShellExecute($filew)
Exit

Func _FileCountLines($sFilePath)
        Local $N = FileGetSize($sFilePath) - 1
        Local $M= ""
        If @error Or $N = -1 Then Return 0
        $M=FileRead($sFilePath)
        $M=StringReplace($M,@CRLF,@CR)
        $M=StringSplit($M,@CR)
        Return $M[0]
EndFunc   ;==>_FileCountLines
 楼主| 发表于 2009-3-11 19:00:20 | 显示全部楼层
ShellExecute($filew) 这一行出错!我也不知道为什么会出错,请帮助看看,谢谢大家
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-27 01:37 , Processed in 0.070484 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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