En ce moment, je suis entrain de développer un script qui permet de compiler un dossier et tout ce qu'il contient pour le faire entrer dans un seul fichier (ce que fait 7zip).
Tout fonctionne parfaitement sauf que les fichiers contenant des images, des musiques, des vidéos, des exécutables, etc... ne fonctionnent plus une fois qu'ils ont été décompilés
Je pense qu'il y a un problème avec touts les caractères bizzards que ce genre de fichier contient mais je ne sais pas comment le résoudre.
Voici le script :
► Afficher le textevoir le script
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <Array.au3>
#include <String.au3>
GUICreate("dir_transfer",255,95)
GUICtrlCreateLabel("Que souhaitez-vous faire ?",5,3,200,20)
$menu1=GUICtrlCreateMenu("Fichier")
$menu2=GUICtrlCreateMenu("Aide")
$menu3=GUICtrlCreateMenuItem("Compiler",$menu1)
$menu4=GUICtrlCreateMenuItem("Décompiler",$menu1)
$apropos=GUICtrlCreateMenuItem("A propos de dir_transfer",$menu2)
$meserr=GUICtrlCreateMenuItem("Messages d'erreur",$menu2)
$aide=GUICtrlCreateMenuItem("Aide",$menu2)
$button1=GUICtrlCreateButton("Compiler un dossier",5,20,120,50)
$button2=GUICtrlCreateButton("Décompiler un fichier",130,20,120,50)
GUISetState()
While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $apropos
MsgBox(0,"A propos de dir_transfer","Version 1.0.1"&@CRLF&"© 2011 ARTHOS CORPORATION"&@CRLF&"Dir_transfer est un logiciel qui permet de regrouper plusieurs dossiers et fichiers au sein d'un seul fichier."&@CRLF&"Attention, vous n'êtes pas autorisés à modifier le nom ou le contenu d'un fichier DRT. Toute modification risque de rendre le fichier innutilisable."&@CRLF&"Logiciel programé par ARTHOS CORPORATION"&@CRLF&"Pour plus d'informations, contactez arthos.corporation@gmail.com")
Case $meserr
$errorer = InputBox("dir_transfer","Veuillez entrer le code de l'erreur :")
$msger=IniRead(@ScriptDir&"\error.ini", "#error#", "#"&$errorer&"#", "Code d'erreur invalide")
MsgBox(0,"dir_transfer","Code d'erreur : "&$errorer&@CRLF&$msger)
Case $aide
MsgBox(0,"Aide dir_transfer","Compiler :"&@CRLF&"Compiler sert à rassembler touts les dossier et fichiers présents dans un dossier donner sous un seul fichier DRT."&@CRLF&"Décompiler :"&@CRLF&"Décompiler sert à recréer les dossiers et fichiers à partir d'un fichier DRT"&@CRLF&"Messages d'erreur :"&@CRLF&"Messages d'erreur sert à savoir de quel erreur il s'agit en fonction du code d'erreur")
Case $GUI_EVENT_CLOSE
Exit
Case $button1
GUIDelete()
ExitLoop
Case $menu3
GUIDelete()
ExitLoop
Case $menu4
GUIDelete()
_decompiler()
Case $button2
GUIDelete()
_decompiler()
EndSwitch
WEnd
Func _decompiler()
$file = FileOpenDialog("Choisisez un fichier", "", "Fichier DRT (*.drt)")
If @error = 1 Then
Exit
EndIf
$var1=FileRead($file,14)
$version=FileRead($file,20)
If $var1 <> "#dir_transfer#" Then
MsgBox(16,"dir_transfer","Erreur :"&@CRLF&@CRLF&"Fichier invalide"&@CRLF&'#dir_transfer# non trouvé dans : '&@CRLF&$file&@CRLF&"Code d'erreur : L1#1#14")
Exit
EndIf
If $version <> "#dir_transfer#1.0.1#" Then
MsgBox(16,"dir_transfer","Erreur :"&@CRLF&@CRLF&"Version incompatible"&@CRLF&$file&" n'est pas compatible avec la version de logiciel que vous utilisez"&@CRLF&"Code d'erreur : V1#IC")
Exit
EndIf
$dir = 0
$file2 = 0
$dirplace=IniRead($file, "#start#", "#name#", "NotFound")
If $dirplace="" Then
MsgBox(16,"dir_transfer","Erreur :"&@CRLF&@CRLF&"Fichier invalide"&@CRLF&'#name# non trouvé dans : '&@CRLF&$file&@CRLF&"Code d'erreur : L5#1#6")
Exit
EndIf
FileWrite(@tempdir&"\temp_dir_transfer",$file)
_ReplaceStringInFile(@tempdir&"\temp_dir_transfer",$dirplace,"")
$filedir=FileRead(@tempdir&"\temp_dir_transfer")
FileDelete(@tempdir&"\temp_dir_transfer")
FileWrite(@tempdir&"\temp_dir_transfer_2",$dirplace)
_ReplaceStringInFile(@tempdir&"\temp_dir_transfer_2",".drt","")
$ilexist=FileRead(@tempdir&"\temp_dir_transfer_2")
FileDelete(@tempdir&"\temp_dir_transfer_2")
$exist = FileExists($filedir&$ilexist)
If $exist = 1 Then
MsgBox(16,"dir_transfer","Erreur :"&@CRLF&@CRLF&"Le dossier existe déjà !"&@CRLF&$filedir&$ilexist&@CRLF&'existe déjà'&@CRLF&"Code d'erreur : D1#EX")
Exit
EndIf
SplashTextOn("dir_transfer","Veuillez patienter pendant que votre fichier se fait décompiler.",220,80,-1,-1,2)
While 1
$dir=$dir+1
$dir_create=IniRead($file, "#start#", "#dir"&$dir&"#", "NotFound")
If $dir_create = "end" Then
ExitLoop
EndIf
DirCreate($filedir&$dir_create)
WEnd
While 1
$file2=$file2+1
$file_create=IniRead($file, "#start#", "#file"&$file2&"#", "NotFound")
If $file_create = "end" Then
ExitLoop
EndIf
$string=FileRead($file)
$filetowrit_e=_StringBetween($string,"<file|"&$file2&"|start>","<file|"&$file2&"|end>")
FileWrite($filedir&$file_create,$filetowrit_e[0])
_ReplaceStringInFile($filedir&$file_create,"#CROP#","[")
_ReplaceStringInFile($filedir&$file_create,"#CRCL#","]")
WEnd
SplashOff()
MsgBox(64,"dir_transfer","Votre fichier à été décompilé.")
Exit
EndFunc
$path = FileSelectFolder ("Choisisez un dossier","C:")
If @error = 1 Then
Exit
EndIf
FileDelete(@TempDir&"\Name.art.tmp")
FileWrite(@TempDir&"\Name.art.tmp",$path)
_ReplaceStringInFile(@TempDir&"\Name.art.tmp","\",@CRLF)
$namedir = FileReadLine(@TempDir&"\Name.art.tmp",_FileCountLines(@TempDir&"\Name.art.tmp"))
FileDelete(@TempDir&"\Name.art.tmp")
FileDelete(@TempDir&"\Slash.art.tmp")
FileWrite(@TempDir&"\Slash.art.tmp",$path)
_ReplaceStringInFile(@TempDir&"\Slash.art.tmp","\",@CRLF)
$numline = _FileCountLines(@TempDir&"\Slash.art.tmp")
$readline = FileReadLine(@TempDir&"\Slash.art.tmp",$numline)
FileDelete(@TempDir&"\Slash.art.tmp")
FileWrite(@TempDir&"\Slash.art.tmp",$path)
_ReplaceStringInFile(@TempDir&"\Slash.art.tmp","\"&$readline,"")
$path2 = FileRead(@TempDir&"\Slash.art.tmp")
FileDelete(@TempDir&"\Slash.art.tmp")
If FileExists($path2 & "\"&$namedir&".drt") Then
$MsgBox = MsgBox(4,"dir_transfer","Le fichier :"&@CRLF&$path2 & "\"&$namedir&".drt"&@CRLF&"existe déjà ! Voulez-vous le supprimer pour pouvoir créer le nouveau fichier ?"&@CRLF&@CRLF&"ATTENTION : Si vous cliquez sur non, le nouveau fichier ne sera pas créé !")
If $MsgBox = 6 Then FileDelete($path2 & "\"&$namedir&".drt")
If $MsgBox = 7 Then Exit
EndIf
If $path = "" Then
Exit
EndIf
SplashTextOn("dir_transfer","Veuillez patienter pendant que votre dossier se fait compiler.",220,80,-1,-1,2)
$FileList = _RecFileListToArray($path, "*", 0, 1, 0)
$list = @TempDir & "\"&$namedir&".drt.tmp"
$txt = FileOpen($list, 1)
FileWrite($txt,"#dir_transfer#1.0.1#"&@CRLF&@CRLF&"[#start#]"&@CRLF&@CRLF&"#name#="&$namedir&".drt"&@CRLF&"#dir1#="&$namedir&@CRLF)
$doss = 2
$filenumb = 1
For $i = 1 to $FileList[0]
If StringInStr(FileGetAttrib($path & "\" & $FileList[$i]), "D") <> 0 Then
FileWriteLine ($txt, @CRLF&"#dir"&$doss&"#="&$namedir&"\" & $FileList[$i])
$doss += 1
Else
FileWriteLine ($txt, "#file"&$filenumb&"#="&$namedir&"\"&$FileList[$i])
$li=FileRead($path&"\"&$FileList[$i])
$lin = StringReplace($li,"[","#CROP#")
$line = StringReplace($lin,"]","#CRCL#")
FileWriteLine ($txt, "#file"&$filenumb&"|cont#=<file|"&$filenumb&"|start>"&$line&"<file|"&$filenumb&"|end>")
$filenumb += 1
EndIf
Next
FileWriteLine($txt,"#file"&$filenumb&"#=end"&@CRLF&"#dir"&$doss&"#=end")
FileClose($txt)
Func _RecFileListToArray($sPath, $sFilter = "*", $iFlag = 0, $iRecur = 0, $iFullPath = 0)
Local $asFileList[1], $sFullPath
If Not FileExists($sPath) Then Return SetError(1, 1, "")
If StringRight($sPath, 1) <> "\" Then $sPath = $sPath & "\"
If (StringInStr($sFilter, "\")) Or (StringInStr($sFilter, "/")) Or (StringInStr($sFilter, ":")) Or (StringInStr($sFilter, ">")) Or (StringInStr($sFilter, "<")) Or (StringInStr($sFilter, "|")) Or (StringStripWS($sFilter, 8) = "") Then Return SetError(2, 2, "")
If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
If Not ($iRecur = 0 Or $iRecur = 1) Then Return SetError(4, 4, "")
If $iFullPath = 0 Then
$sFullPath = $sPath
ElseIf $iFullPath = 1 Then
$sFullPath = ""
Else
Return SetError(5, 5, "")
EndIf
_FLTA_Search($sPath, $sFilter, $iFlag, $iRecur, $sFullPath, $asFileList)
If $asFileList[0] = 0 Then Return SetError(6, 6, "")
Return $asFileList
EndFunc
Func _FLTA_Search($sStartFolder, $sFilter, $iFlag, $iRecur, $sFullPath, ByRef $asFileList)
Local $hSearch, $sFile
If StringRight($sStartFolder, 1) <> "\" Then $sStartFolder = $sStartFolder & "\"
$hSearch = FileFindFirstFile($sStartFolder & $sFilter)
If $hSearch > 0 Then
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
Switch $iFlag
Case 0
If $iRecur And StringInStr(FileGetAttrib($sStartFolder & $sFile), "D") <> 0 Then ContinueLoop
Case 1
If StringInStr(FileGetAttrib($sStartFolder & $sFile), "D") <> 0 Then ContinueLoop
Case 2
If StringInStr(FileGetAttrib($sStartFolder & $sFile), "D") = 0 Then ContinueLoop
EndSwitch
If $iFlag = 1 And StringInStr(FileGetAttrib($sStartFolder & $sFile), "D") <> 0 Then ContinueLoop
If $iFlag = 2 And StringInStr(FileGetAttrib($sStartFolder & $sFile), "D") = 0 Then ContinueLoop
_FLTA_Add($asFileList, $sFullPath, $sStartFolder, $sFile)
WEnd
FileClose($hSearch)
ReDim $asFileList[$asFileList[0] + 1]
EndIf
If $iRecur = 1 Then
$hSearch = FileFindFirstFile($sStartFolder & "*.*")
If $hSearch > 0 Then
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($sStartFolder & $sFile), "D") And ($sFile <> "." Or $sFile <> "..") Then
If $iFlag <> 1 Then _FLTA_Add($asFileList, $sFullPath, $sStartFolder, $sFile)
_FLTA_Search($sStartFolder & $sFile, $sFilter, $iFlag, $iRecur, $sFullPath, $asFileList)
EndIf
WEnd
FileClose($hSearch)
EndIf
EndIf
EndFunc
Func _FLTA_Add(ByRef $asFileList, $sFullPath, $sStartFolder, $sFile)
Local $sAddFolder
$asFileList[0] += 1
If UBound($asFileList) <= $asFileList[0] Then ReDim $asFileList[UBound($asFileList) * 2]
If $sFullPath = "" Then
$sAddFolder = $sStartFolder
Else
$sAddFolder = StringReplace($sStartFolder, $sFullPath, "")
EndIf
$asFileList[$asFileList[0]] = $sAddFolder & $sFile
EndFunc
FileMove(@TempDir & "\"&$namedir&".drt.tmp",$path2 & "\"&$namedir&".drt")
SplashOff()
MsgBox(64,"dir_transfer","Votre dossier à été compilé."&@CRLF&"ATTENTION, vous ne devez pas modifier le nom ou le contenu du fichier DRT."&@CRLF&"Toute modification risque de rendre le fichier inutilisable.")
Exit





