zhang0121 发表于 2008-6-30 19:41:21

运行时间很长 运行速度很慢
希望大虾帮忙解决

顽固不化 发表于 2008-6-30 19:53:56

试了一下,读取也慢。无法了~~~~
不知用字符串替换能否快一点。。。

[ 本帖最后由 顽固不化 于 2008-6-30 20:41 编辑 ]

zhang0121 发表于 2008-6-30 21:00:49

单纯的字符替换就是怕 不准确啊

顽固不化 发表于 2008-6-30 21:40:12

我试验了一下,只要你的位置确定的和准确的,字符串替换法是可行的。
$nstr=StringReplace($FileString,$i,"FC")
关键是位置$I一定要准确,不知你的$i是怎么得来的。$FilePath = "173242.rar"
$FileHwnd = FileOpen ($FilePath, 16)
$FileString = FileRead($FileHwnd)
FileClose($FileHwnd)
$nstr=StringReplace($FileString,17,"FC")
$FileHwnd = FileOpen ($FilePath&".bak", 2+16)
FileWrite($FileHwnd,$nstr)
FileClose($FileHwnd)
Exit
这是生成后的差异比较结果:
查找差异

1. D:\173242.rar: 541,602 字节
2. D:\173242.rar.bak: 541,602 字节
Offsets: 16 进制

    7:        CF        FC

1 差异 找到。

其位置数据很重要,17,实际是第7字节的第一位置,算下来是第15位置(从0偏移开始计算),加上字符串前面的“0x”就是正确的位置17了。。。

[ 本帖最后由 顽固不化 于 2008-6-30 21:51 编辑 ]

zhang0121 发表于 2008-7-1 12:04:01

我的$i查找思路
;=====================================================
Dim $FilePath,$FileHwnd,$FileString,$BinaryLen,$String
;=====================================================
$FilePath = "*.dll";设定文件1的路径
$FilePath = "*.dll"设定文件2的路径
For $i= 0 To 1;分别读取并文件内容到$FileString,$FileString
      $FileHwnd[$i] = FileOpen ($FilePath[$i], 16)
      $FileString[$i] = FileRead($FileHwnd[$i])
      $BinaryLen[$i] = BinaryLen($FileString[$i])
      FileClose($FileHwnd[$i])
Next
$BinaryLenMin = _Min ( $BinaryLen, $BinaryLen);比较字节长短,如果字节不同 选择较短的为标准
;=================================================
$FileHwnd = FileOpen(@ScriptDir & "\" & "差异.txt",2+8);把差异的位置输出到 差异.txt文件
Check(1,$BinaryLenMin)
;------------------------------
;把输出到 差异.txt 的内容粘贴到这里
;------------------------------
Func Check($l,$m)
ProgressOn ( "执行过程", "进度" , "0/" & $m , 0, 0,2+16)
$j = 100000;为步进基数 每次都需要更改 一般我依次设置为100000、10000、1000、100、10、1
For $i = $l To $m Step $j
        $String = BinaryMid($FileString,$i,$j)
        $String = BinaryMid($FileString,$i,$j)
      if $j > 1 then
        If $String <> $String Then FileWrite ($FileHwnd,"Check(" & $i & "," & $i+$j-1 & ")" & @CRLF)
      else
        If $String <> $String Then FileWrite ($FileHwnd,$i & "." & StringRight($String,2) & "," & StringRight($String,2) & @CRLF);
   endif
        ProgressSet ( 100*$i/$m , $i&"/"&$m)
Next
EndFunc
FileClose($FileHwnd)
;===============================================

最后一次输出的格式是:位置&"."&文件一的不同&"."&文件二的不同& @CRLF

[ 本帖最后由 zhang0121 于 2008-7-1 12:08 编辑 ]

zhang0121 发表于 2008-7-1 12:10:31

我认为这样能够提升查找的速度,分块查找
以10为区块基数
进行划分 查找

这样查找能提速的原因在于
1.不是每一个字节都是不同的,不同的部分是少数
2.不同的部分比较集中表现

顽固不化 发表于 2008-7-1 12:34:13

怎么又变成比较差异了?跟你原来说的替换某值是两回事了,:face (13):

zhang0121 发表于 2008-7-1 12:44:44

查找差异

1. D:\173242.rar: 541,602 字节
2. D:\173242.rar.bak: 541,602 字节
Offsets: 16 进制

    7:    CF    FC

1 差异 找到。
只是对这里 提出点自己的关点

还有就是对于替换 还没有想出什么 好的方法 提升速度
所以随便整两句上来

zhang0121 发表于 2008-7-1 12:51:37

我还在想其他的思路
比如 由于要修改多处
把要修改的地址 如:$point,$point,$point,$point
四个为非连续的位置
在整个$filestring当中根据 array $point[$i] 数组指示的位置 将其分割成数组
$string = stringmid($filestring,1,$point-1)
$string = stringmid($filestring,$point+1,$point-$point)
$string = stringmid($filestring,$point+1,$point-$point)
$string = stringmid($filestring,$point+1,$point-$point)
$string = stringmid($filestring,$point+1,$binarylen-$point)

最后再依次使用"&"连接起来 中间插入修改的值

从而减少过多的字节操作 提升速度
但这种思路对于 大文件 是否有也有效 就不清楚了

顽固不化 发表于 2008-7-1 12:54:28

那个图是我用字符串替换函数,替换前后的结果对比。是在winhex里整的,只是说明字符串替换这个方法是可行的。并且,只要知道了要替换的1字节在文件的位置,这种替换方法非常快。

zhang0121 发表于 2008-7-1 13:22:36

原来如此
谢谢 确实很有效

顽固不化 发表于 2008-7-1 14:05:49

原帖由 zhang0121 于 2008-7-1 13:22 发表 http://www.autoitx.com/images/common/back.gif
原来如此
谢谢 确实很有效

张先生,问题解决了吗?
页: 1 [2]
查看完整版本: FileOpen (文件名,16)情况下,对FileRead返回值的修改