; #FUNCTION# ;===============================================================================
;
; Name...........: _MD5ForFile
; Description ...: Calculates MD5 value for the specific file.
; Syntax.........: _MD5ForFile ($sFile)
; Parameters ....: $sFile - Full path to the file to process.
; Return values .: Success - Returns MD5 value in form of hex string
; - Sets @error to 0
; Failure - Returns empty string and sets @error:
; |1 - CreateFile function or call to it failed.
; |2 - CreateFileMapping function or call to it failed.
; |3 - MapViewOfFile function or call to it failed.
; |4 - MD5Init function or call to it failed.
; |5 - MD5Update function or call to it failed.
; |6 - MD5Final function or call to it failed.
; Author ........: trancexx
;
;==========================================================================================
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[0] = -1 Then
Return SetError(1, 0, "")
EndIf
Local $hFile = $a_hCall[0]
$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[0] Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
Return SetError(2, 0, "")
EndIf
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
Local $hFileMappingObject = $a_hCall[0]
$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[0] Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(3, 0, "")
EndIf
Local $pFile = $a_hCall[0]
Local $iBufferSize = FileGetSize($sFile)
Local $tMD5_CTX = DllStructCreate("dword i[2];" & _
"dword buf[4];" & _
"ubyte in[64];" & _
"ubyte digest[16]")
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
ну тут не обязательно сравнивать по контрольной сумме, принципиален сам процесс подключения и проверки файла(например, с сервера 192.168.1.1 проверить файл var.rar по эталонному размеру на компьютерах 192.168.1.2, 192.168.1.5, 192.168.1.11, 192.168.1.50 и сохранить отчет о проверке на сервере 192.168.1.1 вида:Kaster сказал(а):Если по теме, то
1. Файлы, при соответствующих правах доступа могут быть прочитаны средствами AutoIt так же как и любые другие файлы с использованием UMC-путей.
2. ЕМНИП, то есть целая UDF для вычисления контрольных сумм. Но сейчас нет времени искать. Вот кусок, который я брал для своих целей - вычисление MD5-хеша
$iRAR_size = 65536;
$sFile = 'var.rar'
$iCompsN = 4
Dim $aComps[$iCompsN] = [ _
'192.168.1.2', _
'192.168.1.5', _
'192.168.1.11', _
'192.168.1.50', _
]
$sShared_folder = 'SharedFolder'
$sServerIP = '192.168.1.1'
$sLog_folder = 'Shared log folder'
$sLog = @MDAY & @MON & @YEAR & '_actual.log'
$sLog_path = '\\' & $sServerIP & '\' & $sLog_folder & '\' & $sLog
$hWrite = FileOpen($sLog_path, 2)
For $i = 0 to $iCompsN - 1
If FileGetSize('\\' & $aComps[$i] & '\' & $sShared_folder & '\' & $sFile) = $iRAR_size Then
$sAns = 'OK'
Else
$sAns = 'Error'
EndIf
FileWriteLine($aComps[$i] & @TAB & '-' & @TAB & $sAns)
Next
FileClose($hWrite)
Правильное название этой UDF напишите, пожалуйста. Очень она нужна.есть целая UDF для вычисления контрольных сумм. Но сейчас нет времени искать.
Пока нет, разбираюсь с ценными указаниями!Kaster сказал(а):AtoS
Проблема решена?
Opt("MustDeclareVars", 1)
Global $sFile = FileOpenDialog("Choose file", "", "All files (*)")
If @error Then Exit
Global $hTimer, $iTimer, $sData
; MD55:
$hTimer = TimerInit()
$sData = _MD5ForBigFile($sFile)
$iTimer = TimerDiff($hTimer)
ConsoleWrite("! MD5 took " & $iTimer & " ms" & @CRLF)
ConsoleWrite("Result: " & $sData & @CRLF & @CRLF)
Exit @error
; #FUNCTION# ;===============================================================================
;
; Name...........: _MD5ForBigFile
; Description ...: Calculates MD5 value for the specific file.
; Syntax.........: _MD5ForBigFile ($sFile)
; Parameters ....: $sFile - Full path to the file to process.
; Return values .: Success - Returns MD5 value in form of hex string
; - Sets @error to 0
; Failure - Returns empty string and sets @error:
; |1 - CreateFile function or call to it failed.
; |2 - CreateFileMapping function or call to it failed.
; |3 - MapViewOfFile function or call to it failed.
; |4 - MD5Init function or call to it failed.
; |5 - MD5Update function or call to it failed.
; |6 - MD5Final function or call to it failed.
; Author ........: trancexx ft. boriska
;
;==========================================================================================
Func _MD5ForBigFile($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[0] = -1 Then Return SetError(1, 0, "")
Local $hFile = $a_hCall[0]
$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[0] Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
If Not FileGetSize($sFile) Then Return SetError(0, 0, "D41D8CD98F00B204E9800998ECF8427E")
Return SetError(2, 0, "")
EndIf
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
Local $hFileMappingObject = $a_hCall[0]
Local $tMD5_CTX = DllStructCreate("dword i[2];" & _
"dword buf[4];" & _
"ubyte in[64];" & _
"ubyte digest[16]")
DllCall("advapi32.dll", "none", "MD5Init", "ptr", DllStructGetPtr($tMD5_CTX))
If @error Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(4, 0, "")
EndIf
Local $iMainBufferSize = FileGetSize($sFile)
Local $iMaxBufferSize = 1073741824 ;/ 2
Local $dwFileOffset = 0
Local $iError = @error
While $iMainBufferSize And Not $iError
Local $iBufferSize = $iMainBufferSize
If $iBufferSize > $iMaxBufferSize Then
$iBufferSize = $iMaxBufferSize
EndIf
$iMainBufferSize -= $iBufferSize
Local $dwFileOffsetLow = Dec(Hex($dwFileOffset, 8))
Local $dwFileOffsetHigh = Dec(StringLeft(Hex($dwFileOffset, 16), 8))
$a_hCall = DllCall("kernel32.dll", "ptr", "MapViewOfFile", _
"hwnd", $hFileMappingObject, _
"dword", 4, _ ; FILE_MAP_READ
"dword", $dwFileOffsetHigh, _
"dword", $dwFileOffsetLow, _
"dword", $iBufferSize)
If @error Or Not $a_hCall[0] Then
If @error Then $iError = 3
ExitLoop
EndIf
$dwFileOffset += $iBufferSize
Local $pFile = $a_hCall[0]
DllCall("advapi32.dll", "none", "MD5Update", _
"ptr", DllStructGetPtr($tMD5_CTX), _
"ptr", $pFile, _
"dword", $iBufferSize)
If @error Then $iError = 5
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
WEnd
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
If $iError Then Return SetError($iError, 0, "")
DllCall("advapi32.dll", "none", "MD5Final", "ptr", DllStructGetPtr($tMD5_CTX))
If @error Then Return SetError(6, 0, "")
Local $sMD5 = Hex(DllStructGetData($tMD5_CTX, "digest"))
Return SetError(0, 0, $sMD5)
EndFunc ;==>_MD5ForBigFile