[UDF] _FileToBinaryFunction.au3 (Fichiers dans votre code)

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

[UDF] _FileToBinaryFunction.au3 (Fichiers dans votre code)

#1

Message par Tlem »

Voici un petit UDF intéressent, qui vous permettra d'intégrer un fichier directement dans le code source de votre script.
Ce code fonctionne pour tous types de fichiers sans exception (attention toutefois à la taille de ceux-ci).
Cette fonction ne remplace en rien l'utilisation de la commande FileInstall(), ou l'ajout des ressources directement à l'exécutable par le biais de directive ou l'utilisation de ResHacker, mais elle ajoute une portée différente à l'intégration d'un fichier ou d'une ressource à votre code.

Description :
Le fichier est inscrit sous forme de chaînes binaires de 128 caractères dans une fonction pour être utilisé plus tard en tant que chaîne unique.

Pour re-générer le fichier, il suffit de lancer la fonction (Pour ce faire, dé-commenté la deuxième ligne du script généré et lancez le script).
Vous devrez aussi modifier le chemin et le nom du fichier, sinon le nom d'origine est utilisé et le fichier sera donc re-généré en lieu et place du fichier d'origine.

Voici l'UDF en question, adapté de l'UDF original ConvertImageToBinary.au3.
J'ai rajouter le code pour re-générer le fichier et modifier la manière dont est géré le nom de la fonction.

Code : Tout sélectionner

#cs ----------------------------------------------------------------------------

 AutoIt Version(s)  : 3.2.12.0 - 3.3.2.0
 Auteur             : Tlem

 Fonction du Script :
    Script adapté de l'UDF ConvertImageToBinary.au3 qui permet de transformer
    un fichier en code binaire qui peut être inclus tel quel dans un code AutoIt.
    L'appel de la fonction permet de re-générer le fichier.

#ce ----------------------------------------------------------------------------

$file = FileOpenDialog("Fichier à convertir", @DesktopDir, "All Files (*.*)")
If @error Then Exit

$Fname = StringTrimLeft($file, StringInStr($file, "\", 1, -1))
$Path = StringTrimRight($file, StringLen($Fname))

$f = FileOpen($file, 16)
$t = FileRead($f)
FileClose($f)
$z = StringRegExp($t, "(.{1,128})", 3)
$Ubound = UBound($z)
$FuncName = StringReplace($Fname, ".", "_")
$FuncName = StringRegExpReplace($FuncName, '[^\w]', '')
$FuncName = StringRegExpReplace($FuncName, '[^\D]', '')

$String = '; Décommenté la ligne si dessous pour re-générer le fichier (vous pouvez ajuster le nom et le chemin).' & @CRLF
$String &= '; ' & $FuncName & '("' &  $Path & $Fname& '")' & @CRLF & @CRLF


If $Ubound = 1 Then
    $String &= 'Func ' & $FuncName & '($Name)' & @CRLF & '   $FileBin = "' & $z[0] & '"'
ElseIf $Ubound > 1 Then
    $String &= 'Func ' & $FuncName & '($Name)' & @CRLF & '   $FileBin = "' & $z[0] & '"' & @CRLF
    For $i = 1 To $Ubound - 2 Step 1
        $String &= '   $FileBin &= "' & $z[$i] & '"' & @CRLF
    Next
    $String &= '   $FileBin &= "' & $z[$Ubound - 1] & '"' & @CRLF
EndIf

If $Ubound > 0 Then
    $String &= @CRLF
    $String &= '   $hFile = FileOpen($Name, 17)' & @CRLF
    $String &= '   If $hFile = -1 Then' & @CRLF
    $String &= '     MsgBox(0, "Erreur", "Impossible de re-créer le fichier.")' & @CRLF
    $String &= '     Exit' & @CRLF
    $String &= '   EndIf' & @CRLF
    $String &= '   FileWrite($hFile, $FileBin)' & @CRLF
    $String &= '   FileClose($hFile)' & @CRLF & @CRLF
    $String &= 'EndFunc'
EndIf

FileDelete(@TempDir & "\FicTmp.au3")
FileWrite(@TempDir & "\FicTmp.au3", $String)
ShellExecute(@TempDir & "\FicTmp.au3", '', '', "edit")
Voici un exemple de fichier créé :
► Afficher le texte
Pour re-généré ce fichier, vous n'avez qu'à dé-commenter la deuxième ligne puis à lancer le script.
Le fichier C:\_FileToBinaryFunction_Demo.txt sera re-généré avec son contenu.
Sinon il vous suffira d'appeler la fonction _FileToBinaryFunction_Demo_txt() (fonction générée dynamiquement avec le nom du fichier d'origine), en précisant en argument le nom et le cas échéant le chemin du fichier de sortie.

Edition du 17/06/2011 :
Voici une version beaucoup plus simple et qui génère une simple fonction dont le rôle est de créer une variable qui contiendra le code binaire de votre fichier. Ensuite, libre à vous de faire ce que vous voulez avec cette variable (écriture de fichier ou utilisation directe à partir de la mémoire).

Code : Tout sélectionner

#cs ----------------------------------------------------------------------------

 AutoIt Version(s)  : 3.3.6.1
 Auteur             : Tlem

 Fonction du Script :
    Script adapté de l'UDF ConvertImageToBinary.au3 qui permet de transformer
    un fichier en code binaire qui peut être inclus tel quel dans un code AutoIt.
    L'appel de la fonction permet de recupérer le fichier sous forme binaire
    afin de le recréer ou de l'utiliser tel quel à partir de la mémoire.

#ce ----------------------------------------------------------------------------

$file = FileOpenDialog("Fichier à convertir", @DesktopDir, "All Files (*.*)")
If @error Then Exit

$Fname = StringTrimLeft($file, StringInStr($file, "\", 1, -1))
$Path = StringTrimRight($file, StringLen($Fname))

$f = FileOpen($file, 16)
$t = FileRead($f)
FileClose($f)
$z = StringRegExp($t, "(.{1,512})", 3) ; Longeur de ligne (512)
$Ubound = UBound($z)
$FuncName = StringReplace($Fname, ".", "_")
$FuncName = StringRegExpReplace($FuncName, '[^\w]', '')
$FuncName = StringRegExpReplace($FuncName, '[^\D]', '')

Global $String

If $Ubound = 1 Then
    $String &= 'Func ' & $FuncName & '()' & @CRLF & '   Local _' & @CRLF & '   $FileBin = "' & $z[0] & '"'
ElseIf $Ubound > 1 Then
    $String &= 'Func ' & $FuncName & '()' & @CRLF & '   Local _'& @CRLF & '   $FileBin = "' & $z[0] & '"' & @CRLF
    For $i = 1 To $Ubound - 2 Step 1
        $String &= '   $FileBin &= "' & $z[$i] & '"' & @CRLF
    Next
    $String &= '   $FileBin &= "' & $z[$Ubound - 1] & '"' & @CRLF
EndIf

If $Ubound > 0 Then
    $String &= '   Return Binary($FileBin)' & @CRLF
    $String &= 'EndFunc'
EndIf

FileDelete(@TempDir & "\FicTmp.au3")
FileWrite(@TempDir & "\FicTmp.au3", $String)
ShellExecute(@TempDir & "\FicTmp.au3", '', '', "edit")
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] _FileToBinaryFunction.au3 (Fichiers dans votre code)

#2

Message par Tlem »

Mise à jour du premier message.

Code :
- Ajout du contrôle du nom de la fonction générée dynamiquement (avant certains caractère parasite pouvaient rendre la fonction inopérante).
- Suppression de l'Include Array.au3 totalement inutile.
- Suppression de la valeur par défaut de l'argument de la fonction.

Message :
- Ajout de certaines précisions (type de fichiers, fonctionnement).
- Ajout d'un exemple de fichier résultant.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Habibsbib
Niveau 7
Niveau 7
Messages : 393
Enregistré le : dim. 30 août 2009 13:49
Localisation : Euh...Verticale, entre le siège et l'écran...
Status : Hors ligne

Re: [UDF] _FileToBinaryFunction.au3 (Fichiers dans votre code)

#3

Message par Habibsbib »

Faudrait penser à créer une fonction de double binarisation : le fichier sera plus léger sûrement. Mais, c'est pas le but, on pourrait aussi créer une fonction de compression de fihciers.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] _FileToBinaryFunction.au3 (Fichiers dans votre code)

#4

Message par Tlem »

Comme je l'ai déjà dit, une grande majorité des fichiers ou programmes sont déjà plus ou moins compressés, donc le fait de rajouter un traitement de compression, ne fera que ralentir ce code simple. De plus si vous compilez le script avec la compression UPX, je ne vois pas ce que vous gagnerez de plus (à part une perte de temps). :roll:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [UDF] _FileToBinaryFunction.au3 (Fichiers dans votre code)

#5

Message par ani »

Allez hop j'en soumet deux ^^'
:: code exemple

Un petit tout petit code :o
► Afficher le texte
Un autre un peu plus long en multiselection, le fichier va se sauvegarder EN C:\ani.tmp et s'ouvrira avec le logiciel worpad
► Afficher le texte
Dans la fonction _Translate($Fichier), j'ai indiqué les duex modes d'ouverture §(c'etait juste pour montrer l'un et l'autre mode)

TESTE EFFECT
fichier 28ko ==> reviend à ± 56,7 ko (avec le petit code)
à ± 60,7 ko (avec le second code)

En base32
fichier 28ko ==> reviend à ± 45,3 ko

En base64
fichier 28ko ==> reviend à ± 49 ko

voilàvoilà
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [UDF] _FileToBinaryFunction.au3 (Fichiers dans votre code)

#6

Message par timmalos »

Dans la continuation, meme si comme Tlem l'a precedemment expliqué si vous compilez en UPX c'est inutile (Pour cette fonction j'entends) voici les Base64 Encode et Decode pour que le fichier prenne moins de place.
► Afficher le texte
Répondre