Il y a pire : si le nom de fichier contient des caractères Unicode > 0x100, fciv ne le traite pas du tout ! Il n'est pas non plus spécialement véloce sur les gros fichiers et le format de stockage n'est pas formidable.
A votre place, je ferais le(s) hash(es) moi-même et je les stockerais à ma façon. Ma façon c'est forcément une base de données SQLite, ça va sans dire !
Voici un squelette de pseudo code :
Code : Tout sélectionner
#include <SQLite.au3>
_SQLite_Startup()
_SQLite_Open("MonRépertoire\Hashes.sq3) ; open Database
_SQLite_Exec(-1, "CREATE TABLE if not exists Hashes (Id integer primary key, Date char, Chemin char, Fichier char, MD5 char, SHA1 char);" & _
"create index if not exists IdxCheminComplet on Hashes (Chemin, Fichier);" & _
"create index if not exists IdxFichier on Hashes (Fichier);" _
)
_FileListToArrayRec()
Local $md5, $sha1, $fullpath, $chemin, $fichier
For fichier In list
_PathFull() ; optionnel
_PathSplit() ; -> chemin, fichier
$md5 = _md5forfile($fullpath)
$sha1 = _sha1forfile($fullpath)
_SQLite_QuerySingleRow(..., $fullpath, ...)
If old_md5 <> $md5 or old_SHA1 <> $sha1 Then
Disp("Le fichier ... a changé ...")
...
Else
Disp("Nouveau fichier ...")
_SQLite_Exec(-1, "insert into hashes (Date, Chemin, Fichier, MD5, SHA1) " & _
"values (datetime, " & esc($chemin) & ", " & esc($fichier), ", " & $md5 & ", " & $sha1 & ";)" _
)
EndIf
Next
_SQLite_Close()
_SQLite_Shutdown()
Voir ce fil :
https://www.autoitscript.com/forum/topi ... for-files/
Il serait même souhaitable de chiffer cette BdD, ce qui est très simple. Il suffit d'utiliser System.Data.SQLite.dll au lieu de sqlite.dll et d'ajouter deux lignes de code :
Code : Tout sélectionner
_SQLite_Startup()
_SQLite_Open("MonRépertoire\Hashes.sq3) ; open Database
Local $key = InputBox("Contrôle d'accès", "Entrer la clé de chiffrement", "", "*", ...) ; saisie de la clé
_SQLite_Exec(-1, "pragma key = " & esc($key) & ";") ; permet la lecture d'une base chiffrée
Pour le chiffrement initial, changer la clé ou annuler le chiffrement :
_SQLite_Exec(-1, "pragma rekey = " & esc($newkey) & ";")
Par contre, avant de changer la clé d'un chiffrement en place, il faut bien sûr fournir l'ancienne clé. Si la clé est perdue, la base devient illisible (c'est le but !).
On dispose aussi de :
pragma hexkey = '012345ABCD'
pragma hexrekey = '012345ABCD'
pour indiquer une clé en format binaire.
https://system.data.sqlite.org/index.ht ... loads.wiki
Si vous tenez absolument à utuliser fciv, le plus simple est de faire une conversion de l'encodage du résultat.
Code : Tout sélectionner
Func _CodepageToString($sCP, $iCodepage = Default)
If $iCodepage = Int(RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Nls\Codepage", "OEMCP"))
Local $tText = DllStructCreate("byte[" & StringLen($sCP) & "]")
DllStructSetData($tText, 1, $sCP)
Local $aResult = DllCall("kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", StringLen($sCP), _
"ptr", 0, "int", 0)
Local $tWstr = DllStructCreate("wchar[" & $aResult[0] & "]")
$aResult = DllCall("kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", StringLen($sCP), _
"struct*", $tWstr, "int", $aResult[0])
Return DllStructGetData($tWstr, 1)
EndFunc ;==>_CodepageToString
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.