A文件的MD5值跟原来的不一样的时候,用B文件替换A文件的方法?[已解决]
本帖最后由 kuailetiande 于 2014-5-12 15:10 编辑有A文件的MD5值,当验证到A文件的MD5值跟原来的不一样的时候,用B文件替换A文件,是否有好的方法实现? #Include <Crypt.au3>
Local $ver=_MD5ForFile("D:\xxx\xxx.exe")
If $ver ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" Then
MsgBox(0,"","MD5相同:"&$ver)
Else
MsgBox(0,"","MD5不同:"&$ver)
EndIf
Func _MD5ForFile($sFile)
Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFileW", _
"wstr", $sFile, _
"dword", 0x80000000, _ ; GENERIC_READ
"dword", 1, _ ; FILE_SHARE_READ
"ptr", 0, _
"dword", 3, _ ; OPEN_EXISTING
"dword", 0, _ ; SECURITY_ANONYMOUS
"ptr", 0)
If @error Or $a_hCall = -1 Then
Return SetError(1, 0, "")
EndIf
Local $hFile = $a_hCall
$a_hCall = DllCall("kernel32.dll", "ptr", "CreateFileMappingW", _
"hwnd", $hFile, _
"dword", 0, _ ; default security descriptor
"dword", 2, _ ; PAGE_READONLY
"dword", 0, _
"dword", 0, _
"ptr", 0)
If @error Or Not $a_hCall Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
Return SetError(2, 0, "")
EndIf
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
Local $hFileMappingObject = $a_hCall
$a_hCall = DllCall("kernel32.dll", "ptr", "MapViewOfFile", _
"hwnd", $hFileMappingObject, _
"dword", 4, _ ; FILE_MAP_READ
"dword", 0, _
"dword", 0, _
"dword", 0)
If @error Or Not $a_hCall Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(3, 0, "")
EndIf
Local $pFile = $a_hCall
Local $iBufferSize = FileGetSize($sFile)
Local $tMD5_CTX = DllStructCreate("dword i;" & _
"dword buf;" & _
"ubyte in;" & _
"ubyte digest")
DllCall("advapi32.dll", "none", "MD5Init", "ptr", DllStructGetPtr($tMD5_CTX))
If @error Then
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(4, 0, "")
EndIf
DllCall("advapi32.dll", "none", "MD5Update", _
"ptr", DllStructGetPtr($tMD5_CTX), _
"ptr", $pFile, _
"dword", $iBufferSize)
If @error Then
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(5, 0, "")
EndIf
DllCall("advapi32.dll", "none", "MD5Final", "ptr", DllStructGetPtr($tMD5_CTX))
If @error Then
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(6, 0, "")
EndIf
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Local $sMD5 = Hex(DllStructGetData($tMD5_CTX, "digest"))
Return SetError(0, 0, $sMD5)
EndFunc ;==>_MD5ForFile a.txt、b.txt、demo.au3放置于同目录,a.txt、b.txt用来模拟你的文件A和B。#include <Crypt.au3>
Opt('MustDeclareVars', 1)
_Main()
Exit
Func _Main()
Local $FileA = @ScriptDir & '\a.txt'
Local $FileB = @ScriptDir & '\b.txt'
Local $MD5 = '0x202CB962AC59075B964B07152D234B70'
Local $FileA_MD5 = _Crypt_HashFile($FileA, $CALG_MD5)
If $FileA_MD5 <> $MD5 Then
FileCopy($FileB, $FileA, 1)
MsgBox(0, '', '文件已替换')
EndIf
EndFunc ;==>_Main
回复 2# fuldho
多大点儿事搞这么复杂…… 回复 4# skyfree
我忘了删除#include <Crypt.au3>
带#include <Crypt.au3>编译会比我的代码少 回复 4# skyfree
我忘了删除#include <Crypt.au3>
带#include <Crypt.au3>编译会比我的代码少 回复 3# skyfree
哈哈 多谢谢各位的帮助
页:
[1]