#RequireAdmin #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_icon=Comparaison\Comparaison.ico #AutoIt3Wrapper_outfile=Comparaison.exe #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #AutoIt3Wrapper_Res_Field=Nom (short)|Comparaison #AutoIt3Wrapper_Res_Field=Nom (long)|Comparaison #AutoIt3Wrapper_Res_Field=Version (short)|1.0 #AutoIt3Wrapper_Res_Field=Version (long)|1.0.0.0 #AutoIt3Wrapper_Res_Field=Description|Module de comparaison de fichiers/dossiers #AutoIt3Wrapper_Res_Field=Type|Comparaison #AutoIt3Wrapper_Res_Field=Auteur|ZDS [Equipe nAiO] #AutoIt3Wrapper_Res_Field=Site|http://www.naio.fr #AutoIt3Wrapper_Res_SaveSource=n #AutoIt3Wrapper_UseUpx=n #AutoIt3Wrapper_Res_Language=1036 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ; Entête du module Global Const _ $MODULE_NOM = "Comparaison", $MODULE_AUTEUR = "ZDS", $MODULE_VERSION = "1.0", $MODULE_DIR = @ScriptDir&"\"&StringRegExpReplace(@ScriptName, "\.[^\.]+$","") Global Const _ $DEBUG_MODE = (FileExists("debug.txt")=1) #Region Librairies AutoIt ; Classic #Include #Include #Include ; Extended #include #Include #Include #Include #Include #EndRegion #Region Librairies nAiO ;~ #Include ".\Comparaison\Compilation.au3" Func si($cond, $true, $false) If $cond Then Return $true Return $false EndFunc Func min($a, $b) Return si($a<$b,$a,$b) EndFunc Func max($a, $b) Return si($a>$b,$a,$b) EndFunc Func state($control, $state) Return BitAND(GUICtrlGetState($control),$state) = $state EndFunc #EndRegion ; Initialisation Global Const $fichierCfg = $MODULE_DIR&"\"&$MODULE_NOM&".ini" _Crypt_Startup() #Region Préparation des paramètres Global $dossier0 = "Choisir un dossier", $dossier1, $dossier2 Global $filtreFichiers, $exclusionFichiers, $filtreDossiers, $exclusionDossiers chargerDonnees() #EndRegion Local $sortie = gui_Comparaison() _Crypt_Shutdown() Exit $sortie ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #Region Interface Func gui_Comparaison() ; Interface Local $GUI_size[2] = [1200,900], $IMG_size[2] = [24,24] Local $GUI = GUICreate($MODULE_NOM, $GUI_size[0], $GUI_size[1], Default, Default, 0x80800000) ; $WS_POPUP = 0x80000000 , $WS_BORDER = 0x00800000 GUISetIcon($MODULE_DIR&"\"&$MODULE_NOM&".ico") TraySetIcon($MODULE_DIR&"\"&$MODULE_NOM&".ico") Local $Label_Titre = GUICtrlCreateLabel(WinGetTitle($GUI), 5, 5, $GUI_size[0]-70, 25, Default, 0x00100000) ; $GUI_WS_EX_PARENTDRAG = 0x00100000 GUICtrlSetBkColor($Label_Titre, -2) ; $GUI_BKCOLOR_TRANSPARENT = -2 GUICtrlSetFont($Label_Titre, 15, 800) Local $Bouton_Configurer = GUICtrlCreateButton("@", $GUI_size[0]-30-30, 5, 25, 25) GUICtrlSetFont($Bouton_Configurer, 14, 400, 1, "Webdings") GUICtrlSetTip($Bouton_Configurer, "Configurer le module") Local $Bouton_Quitter = GUICtrlCreateButton("X", $GUI_size[0]-30, 5, 25, 25) GUICtrlSetFont($Bouton_Quitter, Default, 800) GUICtrlSetTip($Bouton_Quitter, "Quitter le module") Local $Label_Separateur1 = GUICtrlCreateLabel("", 5, 35-1, $GUI_size[0]-10, 1) GUICtrlSetBkColor($Label_Separateur1, 0x000000) Local $Label_Intitule1 = GUICtrlCreateLabel("[ < ] Dossier de gauche", 5, 40+3, 120, 20) GUICtrlSetBkColor($Label_Intitule1, -2) ; $GUI_BKCOLOR_TRANSPARENT = -2 Local $Label_DeuxPoints1 = GUICtrlCreateLabel(":", 125, 40+3, 10, 20) GUICtrlSetBkColor($Label_DeuxPoints1, -2) ; $GUI_BKCOLOR_TRANSPARENT = -2 Local $Bouton_Dossier1 = GUICtrlCreateButton($dossier1, 135, 40-1, $GUI_size[0]-140-60, 22) Local $Label_Intitule2 = GUICtrlCreateLabel("[ > ] Dossier de droite", 5, 65+3, 120, 20) GUICtrlSetBkColor($Label_Intitule2, -2) ; $GUI_BKCOLOR_TRANSPARENT = -2 Local $Label_DeuxPoints2 = GUICtrlCreateLabel(":", 125, 65+3, 10, 20) GUICtrlSetBkColor($Label_DeuxPoints2, -2) ; $GUI_BKCOLOR_TRANSPARENT = -2 Local $Bouton_Dossier2 = GUICtrlCreateButton($dossier2, 135, 65-1, $GUI_size[0]-140-60, 22) Local $Bouton_Scanner = GUICtrlCreateButton("Scan", $GUI_size[0]-60, 40, 55, 45) GUICtrlSetState($Bouton_Scanner, si(FileExists($dossier1) And FileExists($dossier2) And $dossier1<>$dossier2,$GUI_ENABLE,$GUI_DISABLE)) ; Liste de valeurs à afficher Global $Listview_Fichiers = GuiCtrlCreateListView("|<|>|Nom du fichier/sous-dossier|Remarque|(file)|(type)|(size)", 5, 90, $GUI_size[0]-10, $GUI_size[1]-90-25-5, BitOR($WS_EX_CLIENTEDGE, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_DOUBLEBUFFER)) Global $Menu_Fichiers = GUICtrlCreateContextMenu($Listview_Fichiers) Global $MenuItems_Fichiers[11] = [10 _ , GUICtrlCreateMenuItem("Copier vers la gauche", $Menu_Fichiers) _ , GUICtrlCreateMenuItem("Supprimer à gauche", $Menu_Fichiers) _ , GUICtrlCreateMenuItem("", $Menu_Fichiers) _ , GUICtrlCreateMenuItem("Copier vers la droite", $Menu_Fichiers) _ , GUICtrlCreateMenuItem("Supprimer à droite", $Menu_Fichiers) _ , GUICtrlCreateMenuItem("", $Menu_Fichiers) _ , GUICtrlCreateMenuItem("Tout supprimer", $Menu_Fichiers) _ , GUICtrlCreateMenuItem("Tout synchroniser", $Menu_Fichiers) _ , GUICtrlCreateMenuItem("", $Menu_Fichiers) _ , GUICtrlCreateMenuItem("Ouvrir le(s) dossier(s)", $Menu_Fichiers) _ ] ; Tailles des colonnes _GUICtrlListView_SetColumnWidth($Listview_Fichiers, 0, 22) _GUICtrlListView_SetColumnWidth($Listview_Fichiers, 1, $IMG_size[0]+1) _GUICtrlListView_SetColumnWidth($Listview_Fichiers, 2, $IMG_size[0]+1) _GUICtrlListView_SetColumnWidth($Listview_Fichiers, 3, $GUI_size[0]-10-22-($IMG_size[0]+1)-($IMG_size[0]+1)-200) _GUICtrlListView_SetColumnWidth($Listview_Fichiers, 4, 200) _GUICtrlListView_SetColumnWidth($Listview_Fichiers, 5, 0) _GUICtrlListView_SetColumnWidth($Listview_Fichiers, 6, 0) _GUICtrlListView_SetColumnWidth($Listview_Fichiers, 7, 0) ; Alignements _GUICtrlListView_JustifyColumn($Listview_Fichiers, 1, 2) _GUICtrlListView_JustifyColumn($Listview_Fichiers, 2, 2) ; Images Local $images = _GUIImageList_Create($IMG_size[0], $IMG_size[1]) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0xFFFFFF, $IMG_size[0], $IMG_size[1])) ; Rien _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0xEEEEEE, $IMG_size[0], $IMG_size[1])) ; Manquant (Fichier manquant) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0xFF6600, $IMG_size[0], $IMG_size[1])) ; Manquant (Fichier présent) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0xEEEEEE, $IMG_size[0], $IMG_size[1])) ; Manquant (Dossier manquant) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0xFF6600, $IMG_size[0], $IMG_size[1])) ; Manquant (Dossier présent) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0xCC0000, $IMG_size[0], $IMG_size[1])) ; Conflit (Fichier à gauche) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0xCC0000, $IMG_size[0], $IMG_size[1])) ; Conflit (Fichier à droite) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0xCC0000, $IMG_size[0], $IMG_size[1])) ; Conflit (Dossier à gauche) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0xCC0000, $IMG_size[0], $IMG_size[1])) ; Conflit (Dossier à droite) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0x00AA00, $IMG_size[0], $IMG_size[1])) ; Résolu (Fichier à gauche) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0x00AA00, $IMG_size[0], $IMG_size[1])) ; Résolu (Fichier à droite) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0x00AA00, $IMG_size[0], $IMG_size[1])) ; Résolu (Dossier à gauche) _GUIImageList_Add($images, _GUICtrlListView_CreateSolidBitMap($Listview_Fichiers, 0x00AA00, $IMG_size[0], $IMG_size[1])) ; Résolu (Dossier à droite) _GUICtrlListView_SetImageList($Listview_Fichiers, $images, 1) ; Progression Global $Label_Infos = GUICtrlCreateLabel("", 5, $GUI_size[1]-25+2, $GUI_size[0]-300-15, 20) GUICtrlSetBkColor($Label_Infos, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetFont($Label_Infos, 10) Global $ProgressBar_Infos = GUICtrlCreateProgress($GUI_size[0]-300-5,$GUI_size[1]-25, 300, 20) ; Traitement GUISetState() _GUICtrlListView_RegisterSortCallBack($Listview_Fichiers) GUIRegisterMsg($WM_NOTIFY, "notify") Local $stop = False, $count = 0, $Lancer_Scanner = False While Not $stop $msg = GUIGetMsg() Switch $msg Case -3, $Bouton_Quitter ; $GUI_EVENT_CLOSE = -3 $stop = True Case $Bouton_Configurer GUISetState(@SW_HIDE, $GUI) ; Création de la fenêtre Local $GUICONFIG = GUICreate($MODULE_NOM&" v"&$MODULE_VERSION, 300, 250, Default, Default, 0x80800000) ; $WS_POPUP = 0x80000000 , $WS_BORDER = 0x00800000 GUISetIcon($MODULE_DIR&"\"&$MODULE_NOM&".ico", Default, $GUICONFIG) ; Déclaration des éléments graphiques Local $GUICONFIG_TITRE = GUICtrlCreateLabel($MODULE_NOM&" : Configuration", 5, 5, 230, 25, Default, 0x00100000) ; $GUI_WS_EX_PARENTDRAG = 0x00100000 GUICtrlSetBkColor($GUICONFIG_TITRE, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetFont($GUICONFIG_TITRE, 15, 800) GUICtrlSetResizing($GUICONFIG_TITRE, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKRIGHT+$GUI_DOCKHEIGHT) Local $GUICONFIG_QUITTER = GUICtrlCreateButton("û", 270, 5, 25, 25) GUICtrlSetFont($GUICONFIG_QUITTER, 18, 400, 1, "Wingdings") GUICtrlSetTip($GUICONFIG_QUITTER, "Quitter la configuration") GUICtrlSetResizing($GUICONFIG_QUITTER, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) Local $GUICONFIG_SEPARATEUR = GUICtrlCreateLabel("", 5, 34, 290, 1) GUICtrlSetBkColor($GUICONFIG_SEPARATEUR, 0x000000) GUICtrlSetResizing($GUICONFIG_SEPARATEUR, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKRIGHT+$GUI_DOCKHEIGHT) Local $GUICONFIG_DONNEES = GUICtrlCreateEdit("", 5, 40, 290, 205) GUICtrlSetData($GUICONFIG_DONNEES, getDonnees()) GUICtrlSetFont($GUICONFIG_DONNEES, Default, Default, Default, "Courier New") GUICtrlSetTip($GUICONFIG_DONNEES, "Données structurées au format INI pour"&@CRLF&"la configuration du module '"&$MODULE_NOM&"'."&@CRLF&"(Attention : réservé aux connaisseurs)", "Données de configuration") GUICtrlSetResizing($GUICONFIG_DONNEES, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKRIGHT+$GUI_DOCKBOTTOM) ; Démarrage de l'affichage GUISetState(@SW_SHOW, $GUICONFIG) ; Traitement Local $config_stop = False While Not $config_stop Local $config_msg = GUIGetMsg() Switch $config_msg Case $GUI_EVENT_CLOSE, $GUICONFIG_QUITTER Local $flux = FileOpen($fichierCfg,10) If @error = 0 Then FileWrite($flux, GUICtrlRead($GUICONFIG_DONNEES)) FileClose($flux) chargerDonnees() $config_stop = True EndIf Case Else ; Rien EndSwitch WEnd GUISetState(@SW_HIDE, $GUICONFIG) GUIDelete($GUICONFIG) Local $reponse = MsgBox(262144+4, $MODULE_NOM, "Relancer le scan?") ; Finalisation GUISetState(@SW_SHOW, $GUI) GUICtrlSetData($Bouton_Dossier1, $dossier1) GUICtrlSetData($Bouton_Dossier2, $dossier2) GUICtrlSetState($Bouton_Scanner, si(FileExists($dossier1) And FileExists($dossier2) And $dossier1<>$dossier2, $GUI_ENABLE, $GUI_DISABLE)) $Lancer_Scanner = ($reponse = 6) Case $Bouton_Dossier1 Local $folder = FileSelectFolder("Choisissez un dossier en tant que 'dossier de gauche' :", "", Default, @ScriptDir, $GUI) If Not @error Then If FileExists($folder) Then GUICtrlSetData($Bouton_Dossier1, $folder) GUICtrlSetState($Bouton_Scanner, si(FileExists(GUICtrlRead($Bouton_Dossier2)) And $folder<>GUICtrlRead($Bouton_Dossier2), $GUI_ENABLE, $GUI_DISABLE)) If FileExists(GUICtrlRead($Bouton_Dossier2)) And $folder<>GUICtrlRead($Bouton_Dossier2) Then _GUICtrlListView_DeleteAllItems($Listview_Fichiers) Else MsgBox(262144+16, $MODULE_NOM, "Dossier choisi incorrect", 10, $GUI) EndIf EndIf Case $Bouton_Dossier2 Local $folder = FileSelectFolder("Choisissez un dossier en tant que 'dossier de droite' :", "", Default, @ScriptDir, $GUI) If Not @error Then If FileExists($folder) Then GUICtrlSetData($Bouton_Dossier2, $folder) GUICtrlSetState($Bouton_Scanner, si(FileExists(GUICtrlRead($Bouton_Dossier1)) And $folder<>GUICtrlRead($Bouton_Dossier1), $GUI_ENABLE, $GUI_DISABLE)) If FileExists(GUICtrlRead($Bouton_Dossier1)) And $folder<>GUICtrlRead($Bouton_Dossier1) Then _GUICtrlListView_DeleteAllItems($Listview_Fichiers) Else MsgBox(262144+16, $MODULE_NOM, "Dossier choisi incorrect", 10, $GUI) EndIf EndIf Case $Bouton_Scanner $Lancer_Scanner = True Case $MenuItems_Fichiers[1], $MenuItems_Fichiers[4] ; Copier vers la gauche / Copier vers la droite Local $direction = si($msg=$MenuItems_Fichiers[1],"gauche","droite") Local $folderIn = GUICtrlRead(si($msg=$MenuItems_Fichiers[1],$Bouton_Dossier2,$Bouton_Dossier1)) Local $folderOut = GUICtrlRead(si($msg=$MenuItems_Fichiers[1],$Bouton_Dossier1,$Bouton_Dossier2)) Local $lock = _GUICtrlListView_BeginUpdate($Listview_Fichiers) If $lock Then Local $vide[1][2] = [[0]] Local $filesToCopy = $vide, $filesToIgnore = $vide, $filesToOverwrite = $vide, $foldersToCopy = $vide, $foldersToIgnore = $vide, $foldersToOverwrite = $vide For $i = 0 To _GUICtrlListView_GetItemCount($Listview_Fichiers)-1 If _GUICtrlListView_GetItemChecked($Listview_Fichiers, $i) Then Local $nom = _GUICtrlListView_GetItemText($Listview_Fichiers, $i, 5) If Number(_GUICtrlListView_GetItemText($Listview_Fichiers, $i, 6)) = 1 Then ; Fichier If Not FileExists($folderIn&$nom) Then addToArray($filesToIgnore, $nom) ElseIf FileExists($folderOut&$nom) Then addToArray($filesToOverwrite, $nom, Number(_GUICtrlListView_GetItemText($Listview_Fichiers, $i, 7))) Else addToArray($filesToCopy, $nom, Number(_GUICtrlListView_GetItemText($Listview_Fichiers, $i, 7))) EndIf Else ; Dossier If Not FileExists($folderIn&$nom) Then addToArray($foldersToIgnore, $nom) ElseIf FileExists($folderOut&$nom) Then addToArray($foldersToOverwrite, $nom, Number(_GUICtrlListView_GetItemText($Listview_Fichiers, $i, 7))) Else addToArray($foldersToCopy, $nom, Number(_GUICtrlListView_GetItemText($Listview_Fichiers, $i, 7))) EndIf EndIf EndIf Next Local $tailleTotale = 0, $liste_FilesAndFoldersToMeasure[5] = [4, $filesToCopy, $filesToOverwrite, $foldersToCopy, $foldersToOverwrite] For $i = 1 To $liste_FilesAndFoldersToMeasure[0] Local $liste = $liste_FilesAndFoldersToMeasure[$i] For $j = 1 To $liste[0][0] $tailleTotale = $tailleTotale + $liste[$j][1] Next Next Local $texte_filesToProcess = @CRLF & " - " & "Aucun fichier à traiter", $texte_foldersToProcess = @CRLF & " - " & "Aucun dossier à traiter" If $filesToCopy[0][0]+$filesToOverwrite[0][0]+$filesToIgnore[0][0] > 0 Then $texte_filesToProcess = "" _ & si($filesToCopy[0][0]>0, @CRLF & " - " & $filesToCopy[0][0] & " " & "fichier"&si($filesToCopy[0][0]>1,"s","") & " " & "copié"&si($filesToCopy[0][0]>1,"s","") , "") _ & si($filesToOverwrite[0][0]>0, @CRLF & " - " & $filesToOverwrite[0][0] & " " & "fichier"&si($filesToOverwrite[0][0]>1,"s","") & " " & "écrasé"&si($filesToOverwrite[0][0]>1,"s","") , "") _ & si($filesToIgnore[0][0]>0, @CRLF & " - " & $filesToIgnore[0][0] & " " & "fichier"&si($filesToIgnore[0][0]>1,"s","") & " " & "ignoré"&si($filesToIgnore[0][0]>1,"s","") , "") _ & "" EndIf If $foldersToCopy[0][0]+$foldersToOverwrite[0][0]+$foldersToIgnore[0][0] > 0 Then $texte_foldersToProcess = "" _ & si($foldersToCopy[0][0]>0, @CRLF & " - " & $foldersToCopy[0][0] & " " & "dossier"&si($foldersToCopy[0][0]>1,"s","") & " " & "copié"&si($foldersToCopy[0][0]>1,"s","") , "") _ & si($foldersToOverwrite[0][0]>0, @CRLF & " - " & $foldersToOverwrite[0][0] & " " & "dossier"&si($foldersToOverwrite[0][0]>1,"s","") & " " & "écrasé"&si($foldersToOverwrite[0][0]>1,"s","") , "") _ & si($foldersToIgnore[0][0]>0, @CRLF & " - " & $foldersToIgnore[0][0] & " " & "dossier"&si($foldersToIgnore[0][0]>1,"s","") & " " & "ignoré"&si($foldersToIgnore[0][0]>1,"s","") , "") _ & "" EndIf Local $reponse = MsgBox(262144+256+48+4, $MODULE_NOM, "Récapitulatif :" & @CRLF _ & $texte_filesToProcess & $texte_foldersToProcess _ & @CRLF & "Taille totale à traiter : " & formatSize($tailleTotale) _ & @CRLF & @CRLF & "Confirmer la copie vers la "&$direction&" ?" _ , 30, $GUI _ ) If $reponse = 6 Then GUICtrlSetData($ProgressBar_Infos, 0) Local $taille = 0, $tailleTraitee = 0, $stop = False ; Files For $i = 1 To $filesToCopy[0][0] If Not $stop Then GUICtrlSetData($Label_Infos, "Copie de fichier : '.."&$filesToCopy[$i][0]&"'") If $tailleTotale > 0 Then GUICtrlSetData($ProgressBar_Infos, Round(100*$tailleTraitee/$tailleTotale)) If FileCopy($folderIn&$filesToCopy[$i][0], $folderOut&$filesToCopy[$i][0], 0) = 1 Then $taille += $filesToCopy[$i][1] $tailleTraitee += $filesToCopy[$i][1] EndIf Next For $i = 1 To $filesToOverwrite[0][0] If Not $stop Then GUICtrlSetData($Label_Infos, "Ecrasement de fichier : '.."&$filesToOverwrite[$i][0]&"'") If $tailleTotale > 0 Then GUICtrlSetData($ProgressBar_Infos, Round(100*$tailleTraitee/$tailleTotale)) If FileCopy($folderIn&$filesToOverwrite[$i][0], $folderOut&$filesToOverwrite[$i][0], 1) = 1 Then $taille += $filesToOverwrite[$i][1] $tailleTraitee += $filesToOverwrite[$i][1] EndIf Next ; Folders For $i = 1 To $foldersToCopy[0][0] If Not $stop Then GUICtrlSetData($Label_Infos, "Copie de dossier : '.."&$foldersToCopy[$i][0]&"'") If $tailleTotale > 0 Then GUICtrlSetData($ProgressBar_Infos, Round(100*$tailleTraitee/$tailleTotale)) If DirCopy($folderIn&$foldersToCopy[$i][0], $folderOut&$foldersToCopy[$i][0], 0) = 1 Then $taille += $foldersToCopy[$i][1] $tailleTraitee += $foldersToCopy[$i][1] EndIf Next For $i = 1 To $foldersToOverwrite[0][0] If Not $stop Then GUICtrlSetData($Label_Infos, "Ecrasement de dossier : '.."&$foldersToOverwrite[$i][0]&"'") If $tailleTotale > 0 Then GUICtrlSetData($ProgressBar_Infos, Round(100*$tailleTraitee/$tailleTotale)) If DirCopy($folderIn&$foldersToOverwrite[$i][0], $folderOut&$foldersToOverwrite[$i][0], 1) = 1 Then $taille += $foldersToOverwrite[$i][1] $tailleTraitee += $foldersToOverwrite[$i][1] EndIf Next GUICtrlSetData($Label_Infos, "Copie vers la "&$direction&" effectuée avec "&si($taille = $tailleTotale, "succès", "erreur")) GUICtrlSetData($ProgressBar_Infos, 0) MsgBox(262144+si($taille = $tailleTotale, 64, 16), $MODULE_NOM, "Copie vers la "&$direction&" terminée avec "&si($taille = $tailleTotale, "succès", "erreur"&@CRLF&"Taille à traiter : "&formatSize($tailleTotale)) & @CRLF & "Taille traitée : "&formatSize($taille), 30, $GUI) EndIf EndIf _GUICtrlListView_EndUpdate($Listview_Fichiers) Case $MenuItems_Fichiers[2], $MenuItems_Fichiers[5] ; Supprimer à gauche / Supprimer à droite Local $direction = si($msg=$MenuItems_Fichiers[2],"gauche","droite") ;~ Local $folderIn = GUICtrlRead(si($msg=$MenuItems_Fichiers[2],$Bouton_Dossier2,$Bouton_Dossier1)) Local $folderOut = GUICtrlRead(si($msg=$MenuItems_Fichiers[2],$Bouton_Dossier1,$Bouton_Dossier2)) Local $lock = _GUICtrlListView_BeginUpdate($Listview_Fichiers) If $lock Then Local $vide[1][2] = [[0]] Local $filesToDelete = $vide, $filesToIgnore = $vide, $foldersToDelete = $vide, $foldersToIgnore = $vide For $i = 0 To _GUICtrlListView_GetItemCount($Listview_Fichiers)-1 If _GUICtrlListView_GetItemChecked($Listview_Fichiers, $i) Then Local $nom = _GUICtrlListView_GetItemText($Listview_Fichiers, $i, 5) If Number(_GUICtrlListView_GetItemText($Listview_Fichiers, $i, 6)) = 1 Then ; Fichier If Not FileExists($folderOut&$nom) Then addToArray($filesToIgnore, $nom) Else addToArray($filesToDelete, $nom, Number(_GUICtrlListView_GetItemText($Listview_Fichiers, $i, 7))) EndIf Else ; Dossier If Not FileExists($folderOut&$nom) Then addToArray($foldersToIgnore, $nom) Else addToArray($foldersToDelete, $nom, Number(_GUICtrlListView_GetItemText($Listview_Fichiers, $i, 7))) EndIf EndIf EndIf Next Local $tailleTotale = 0, $liste_FilesAndFoldersToMeasure[3] = [2, $filesToDelete, $foldersToDelete] For $i = 1 To $liste_FilesAndFoldersToMeasure[0] Local $liste = $liste_FilesAndFoldersToMeasure[$i] For $j = 1 To $liste[0][0] $tailleTotale = $tailleTotale + $liste[$j][1] Next Next Local $texte_filesToProcess = @CRLF & " - " & "Aucun fichier à traiter", $texte_foldersToProcess = @CRLF & " - " & "Aucun dossier à traiter" If $filesToDelete[0][0]+$filesToIgnore[0][0] > 0 Then $texte_filesToProcess = "" _ & si($filesToDelete[0][0]>0, @CRLF & " - " & $filesToDelete[0][0] & " " & "fichier"&si($filesToDelete[0][0]>1,"s","") & " " & "supprimé"&si($filesToDelete[0][0]>1,"s","") , "") _ & si($filesToIgnore[0][0]>0, @CRLF & " - " & $filesToIgnore[0][0] & " " & "fichier"&si($filesToIgnore[0][0]>1,"s","") & " " & "ignoré"&si($filesToIgnore[0][0]>1,"s","") , "") _ & "" EndIf If $foldersToDelete[0][0]+$foldersToIgnore[0][0] > 0 Then $texte_foldersToProcess = "" _ & si($foldersToDelete[0][0]>0, @CRLF & " - " & $foldersToDelete[0][0] & " " & "dossier"&si($foldersToDelete[0][0]>1,"s","") & " " & "supprimé"&si($foldersToDelete[0][0]>1,"s","") , "") _ & si($foldersToIgnore[0][0]>0, @CRLF & " - " & $foldersToIgnore[0][0] & " " & "dossier"&si($foldersToIgnore[0][0]>1,"s","") & " " & "ignoré"&si($foldersToIgnore[0][0]>1,"s","") , "") _ & "" EndIf Local $reponse = MsgBox(262144+256+48+4, $MODULE_NOM, "Récapitulatif :" & @CRLF _ & $texte_filesToProcess & $texte_foldersToProcess _ & @CRLF & "Taille totale à traiter : " & formatSize($tailleTotale) _ & @CRLF & @CRLF & "Confirmer la suppression à "&$direction&" ?" _ , 30, $GUI _ ) If $reponse = 6 Then Local $taille = 0, $tailleTraitee = 0, $stop = False ; Files For $i = 1 To $filesToDelete[0][0] If Not $stop Then GUICtrlSetData($Label_Infos, "Suppression de fichier : '.."&$filesToDelete[$i][0]&"'") If $tailleTotale > 0 Then GUICtrlSetData($ProgressBar_Infos, Round(100*$tailleTraitee/$tailleTotale)) If FileDelete($folderOut&$filesToDelete[$i][0]) = 1 Then $taille += $filesToDelete[$i][1] $tailleTraitee += $filesToDelete[$i][1] EndIf Next ; Folders For $i = 1 To $foldersToDelete[0][0] If Not $stop Then GUICtrlSetData($Label_Infos, "Suppression de dossier : '.."&$foldersToDelete[$i][0]&"'") If $tailleTotale > 0 Then GUICtrlSetData($ProgressBar_Infos, Round(100*$tailleTraitee/$tailleTotale)) If DirRemove($folderOut&$foldersToDelete[$i][0], 1) = 1 Then $taille += $foldersToDelete[$i][1] $tailleTraitee += $foldersToDelete[$i][1] EndIf Next GUICtrlSetData($Label_Infos, "Suppression à "&$direction&" effectuée avec "&si($taille = $tailleTotale, "succès", "erreur")) GUICtrlSetData($ProgressBar_Infos, 0) MsgBox(262144+si($taille = $tailleTotale, 64, 16), $MODULE_NOM, "Suppression à "&$direction&" terminée avec "&si($taille = $tailleTotale, "succès", "erreur"&@CRLF&"Taille à traiter : "&formatSize($tailleTotale)) & @CRLF & "Taille traitée : "&formatSize($taille), 30, $GUI) EndIf EndIf _GUICtrlListView_EndUpdate($Listview_Fichiers) Case $MenuItems_Fichiers[7] ; Tout supprimer ;~ Local $reponse = MsgBox(0, $MODULE_NOM, Case $MenuItems_Fichiers[8] ; Tout synchroniser ;~ Local $reponse = MsgBox(0, $MODULE_NOM, Case $MenuItems_Fichiers[10] ; Ouvrir le(s) dossier(s) Local $folder1 = GUICtrlRead($Bouton_Dossier1), $folder2 = GUICtrlRead($Bouton_Dossier2) Local $lock = _GUICtrlListView_BeginUpdate($Listview_Fichiers) If $lock Then Local $vide[1][2] = [[0]] Local $foldersToOpen = $vide For $i = 0 To _GUICtrlListView_GetItemCount($Listview_Fichiers)-1 If _GUICtrlListView_GetItemChecked($Listview_Fichiers, $i) Then Local $nom = _GUICtrlListView_GetItemText($Listview_Fichiers, $i, 5) If Number(_GUICtrlListView_GetItemText($Listview_Fichiers, $i, 6)) = 1 Then ; Fichier ; Dossier 1 Local $found = False, $folder = StringReplace(StringRegExpReplace($folder1&$nom, "\\[^\\]*$", ""), "\\", "\") For $j = 1 To $foldersToOpen[0][0] If Not $found And $foldersToOpen[$j][0] = $folder Then $found = True Next If Not $found Then addToArray($foldersToOpen, $folder) EndIf ; Dossier 2 Local $found = False, $folder = StringReplace(StringRegExpReplace($folder2&$nom, "\\[^\\]*$", ""), "\\", "\") For $j = 1 To $foldersToOpen[0][0] If Not $found And $foldersToOpen[$j][0] = $folder Then $found = True Next If Not $found Then addToArray($foldersToOpen, $folder) EndIf Else ; Dossier ; Dossier 1 Local $found = False, $folder = StringReplace($folder1&$nom, "\\", "\") For $j = 1 To $foldersToOpen[0][0] If Not $found And $foldersToOpen[$j][0] = $folder Then $found = True Next If Not $found Then addToArray($foldersToOpen, $folder) EndIf ; Dossier 2 Local $found = False, $folder = StringReplace($folder2&$nom, "\\", "\") For $j = 1 To $foldersToOpen[0][0] If Not $found And $foldersToOpen[$j][0] = $folder Then $found = True Next If Not $found Then addToArray($foldersToOpen, $folder) EndIf EndIf EndIf Next For $i = 1 To $foldersToOpen[0][0] ShellExecute($foldersToOpen[$i][0]) Next EndIf _GUICtrlListView_EndUpdate($Listview_Fichiers) Case Else If $Lancer_Scanner = True Then $Lancer_Scanner = False Local $lock = _GUICtrlListView_BeginUpdate($Listview_Fichiers) If $lock Then _GUICtrlListView_DeleteAllItems($Listview_Fichiers) Local $differences[1][6] = [[0]], $dossier1 = GUICtrlRead($Bouton_Dossier1), $dossier2 = GUICtrlRead($Bouton_Dossier2) If FileExists($dossier1) And FileExists($dossier2) Then compare($differences, $dossier1, $dossier2, $filtreFichiers, $exclusionFichiers, $filtreDossiers, $exclusionDossiers) EndIf For $i = 1 To $differences[0][0] addToListView($Listview_Fichiers, $differences[$i][0], $differences[$i][2], $differences[$i][3], $differences[$i][1], $differences[$i][4], $differences[$i][5]) Next GUICtrlSetData($Label_Infos, "Scan effectué : "&$differences[0][0]&" différence"&si($differences[0][0]>1,"s","")&" entre les deux dossiers") GUICtrlSetData($ProgressBar_Infos, 0) If $differences[0][0] = 0 Then MsgBox(262144+64, $MODULE_NOM, "Dossiers identiques", 30, $GUI) EndIf EndIf _GUICtrlListView_EndUpdate($Listview_Fichiers) EndIf EndSwitch WEnd GUIRegisterMsg($WM_NOTIFY, "") _GUICtrlListView_UnRegisterSortCallBack($Listview_Fichiers) sauvegarder($Bouton_Dossier1,$Bouton_Dossier2) GUIDelete($GUI) Return 0 EndFunc #EndRegion Func sauvegarder($bouton1, $bouton2) If Not FileExists($fichierCfg) Then Local $flux = FileOpen($fichierCfg, 10) If Not @error Then FileClose($flux) EndIf ; Dossiers IniWrite($fichierCfg, $MODULE_NOM, "Dossier1", GUICtrlRead($bouton1)) IniWrite($fichierCfg, $MODULE_NOM, "Dossier2", GUICtrlRead($bouton2)) EndFunc Func getDonnees() Local $resultat = "", $sections = IniReadSectionNames($fichierCfg) If Not @error And $sections[0] > 0 Then For $i = 1 To $sections[0] $resultat = $resultat & @CRLF & @CRLF & "["&$sections[$i]&"]" Local $values = IniReadSection($fichierCfg,$sections[$i]) If Not @error And $values[0][0] > 0 Then For $j = 1 To $values[0][0] $resultat = $resultat & @CRLF & $values[$j][0]&"="&$values[$j][1] Next EndIf Next EndIf Return StringStripWS($resultat,3) EndFunc Func chargerDonnees() $dossier1 = IniRead($fichierCfg, $MODULE_NOM, "Dossier1", $dossier0) $dossier2 = IniRead($fichierCfg, $MODULE_NOM, "Dossier2", $dossier0) $filtreFichiers = IniRead($fichierCfg, $MODULE_NOM, "FiltreFichiers", "") $exclusionFichiers = IniRead($fichierCfg, $MODULE_NOM, "ExclusionFichiers", "") $filtreDossiers = IniRead($fichierCfg, $MODULE_NOM, "FiltreDossiers", "") $exclusionDossiers = IniRead($fichierCfg, $MODULE_NOM, "ExclusionDossiers", "") If Not FileExists($dossier1) Then $dossier1 = $dossier0 If Not FileExists($dossier2) Then $dossier2 = $dossier0 EndFunc Func addToListView($list, $type, $flag1, $flag2, $nom, $size1, $size2) Local $n = _GUICtrlListView_GetItemCount($list), $icone1 = 0, $icone2 = 0, $remarque = "", $width[_GUICtrlListView_GetColumnCount($Listview_Fichiers)] ; 0 = Rien ; 1 = Manquant (Fichier manquant) ; 2 = Manquant (Fichier présent) ; 3 = Manquant (Dossier manquant) ; 4 = Manquant (Dossier présent) ; 5 = Conflit (Fichier à gauche) ; 6 = Conflit (Fichier à droite) ; 7 = Conflit (Dossier à gauche) ; 8 = Conflit (Dossier à droite) ; 9 = Résolu (Fichier à gauche) ; 10 = Résolu (Fichier à droite) ; 11 = Résolu (Dossier à gauche) ; 12 = Résolu (Dossier à droite) Switch $type Case 1 Select Case $flag1 And $flag2 $remarque = "Fichiers en conflit" $icone1 = 5 $icone2 = 6 Case $flag1 $remarque = "Fichier manquant à droite" $icone1 = 2 $icone2 = 1 Case $flag2 $remarque = "Fichier manquant à gauche" $icone1 = 1 $icone2 = 2 Case Else $remarque = "Fichiers identiques" $icone1 = 9 $icone2 = 10 EndSelect Case 2 Select Case $flag1 And $flag2 $remarque = "Dossiers en conflit" $icone1 = 7 $icone2 = 8 Case $flag1 $remarque = "Dossier manquant à droite" $icone1 = 4 $icone2 = 3 Case $flag2 $remarque = "Dossier manquant à gauche" $icone1 = 3 $icone2 = 4 Case Else $remarque = "Dossiers identiques" $icone1 = 11 $icone2 = 12 EndSelect EndSwitch For $i = 0 To UBound($width)-1 $width[$i] = _GUICtrlListView_GetColumnWidth($Listview_Fichiers, $i) Next Local $item = GUICtrlCreateListViewItem($n&"|"&$icone1&"|"&$icone1&"|"&"..."&$nom&"|"&$remarque&"|"&$nom&"|"&$type&"|"&max($size1, $size2), $list) _GUICtrlListView_SetItemImage($list, $n, $icone1, 1) _GUICtrlListView_SetItemImage($list, $n, $icone2, 2) For $i = 0 To UBound($width)-1 _GUICtrlListView_SetColumnWidth($Listview_Fichiers, $i, $width[$i]) Next EndFunc Func addToArray(ByRef $array, $value0, $value1 = 0) $array[0][0] = $array[0][0]+1 ReDim $array[$array[0][0]+1][2] $array[$array[0][0]][0] = $value0 $array[$array[0][0]][1] = $value1 EndFunc Func formatSize($bytes) Local $prefix[5] = ["", "k", "M", "G", "T"], $index = 0 For $i = UBound($prefix)-1 To 1 Step -1 If $bytes > 1024^$i * 0.8 Then $index = $i ExitLoop EndIf Next Return Round($bytes/(1024^$index),2)&" "&$prefix[$index]&"o" EndFunc Func removeTrailingBackslash(ByRef $folder) If StringRight($folder,1) = "\" Then $folder = StringTrimRight($folder,1) EndFunc Func notify($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $structure = DllStructCreate($tagNMHEADER, $lParam) Switch DllStructGetData($structure, "Code") Case $LVN_COLUMNCLICK ; Clic sur colonne If (HWnd(DllStructGetData($structure, "hWndFrom")) = GUICtrlGetHandle($Listview_Fichiers)) Then Local $lock = _GUICtrlListView_BeginUpdate($Listview_Fichiers) If $lock Then Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam) If _GUICtrlListView_GetItemCount($Listview_Fichiers) = 0 Then ; Aucun fichier ElseIf DllStructGetData($tInfo, "SubItem") > 0 Then _GUICtrlListView_SortItems(GUICtrlGetHandle($Listview_Fichiers), DllStructGetData($tInfo, "SubItem")) Else For $i = 0 To _GUICtrlListView_GetItemCount($Listview_Fichiers)-1 _GUICtrlListView_SetItemChecked($Listview_Fichiers, $i, Not _GUICtrlListView_GetItemChecked($Listview_Fichiers, $i)) Next EndIf EndIf _GUICtrlListView_EndUpdate($Listview_Fichiers) EndIf Case $HDN_BEGINTRACKW ; Colonne redimensionnée Local $column = DllStructGetData($structure, "Item"), $blocked = "01256" Return StringInStr($blocked, $column) Case $LVN_ITEMCHANGED If (HWnd(DllStructGetData($structure, "hWndFrom")) = GUICtrlGetHandle($Listview_Fichiers)) Then Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam), $index = DllStructGetData($tInfo, "Item") _GUICtrlListView_SetItemSelected($Listview_Fichiers, $index, False) EndIf EndSwitch Return $__LISTVIEWCONSTANT_GUI_RUNDEFMSG EndFunc Func sousmenu($handle, $context, $target = 0) If @NumParams = 2 Or $target = 0 Then DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", GUICtrlGetHandle($context), "int", 0, "int", MouseGetPos(0), "int", MouseGetPos(1), "hwnd", $handle, "ptr", 0) Else Local $position = ControlGetPos($handle, "", $target), $coords = DllStructCreate("int;int") DllStructSetData($coords, 1, $position[0]+10) DllStructSetData($coords, 2, $position[1]+10) DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $handle, "ptr", DllStructGetPtr($coords)) DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", GUICtrlGetHandle($context), "int", 0, "int", DllStructGetData($coords, 1), "int", DllStructGetData($coords, 2), "hwnd", $handle, "ptr", 0) EndIf EndFunc Func compare(ByRef $diff, $root1, $root2, $filterForFiles="", $excludeFromFiles="", $filterForFolders="", $excludeFromFolders="", $sub = "\", $percentMin = 0, $percentMax = 100) GUICtrlSetData($Label_Infos, "Scan en cours : '.."&$sub&"'") GUICtrlSetData($ProgressBar_Infos, $percentMin) Local $vide[1] = [0] ; Root n°1 Local $files1 = _FileListToArray($root1&$sub,"*",1) If @error Then $files1 = $vide Local $folders1 = _FileListToArray($root1&$sub,"*",2) If @error Then $folders1 = $vide ; Root n°2 Local $files2 = _FileListToArray($root2&$sub,"*",1) If @error Then $files2 = $vide Local $folders2 = _FileListToArray($root2&$sub,"*",2) If @error Then $folders2 = $vide ; Jonction $files Local $files = $files1 For $i = 1 To $files2[0] Local $found = False For $j = 1 To $files[0] If $files[$j] = $files2[$i] Then $found = True ExitLoop EndIf Next If Not $found Then $files[0] = $files[0]+1 ReDim $files[$files[0]+1] $files[$files[0]] = $files2[$i] EndIf Next _ArraySort($files,0,1) ; Jonction $folders Local $folders = $folders1 For $i = 1 To $folders2[0] Local $found = False For $j = 1 To $folders[0] If $folders[$j] = $folders2[$i] Then $found = True ExitLoop EndIf Next If Not $found Then $folders[0] = $folders[0]+1 ReDim $folders[$folders[0]+1] $folders[$folders[0]] = $folders2[$i] EndIf Next _ArraySort($folders,0,1) ; Comparaison $files For $i = 1 To $files[0] Local $file = $files[$i] If ($filterForFiles = "" Or StringRegExp($file, $filterForFiles)) And ($excludeFromFiles = "" Or Not StringRegExp($file, $excludeFromFiles)) Then Local $ok1 = FileExists($root1&$sub&$file), $ok2 = FileExists($root2&$sub&$file) If $ok1 And $ok2 Then If hash($root1&$sub&$file) <> hash($root2&$sub&$file) Then addToDiff($diff, 1, $sub&$file, True, True, FileGetSize($root1&$sub&$file), FileGetSize($root2&$sub&$file)) ElseIf $ok1 And Not $ok2 Then addToDiff($diff, 1, $sub&$file, True, False, FileGetSize($root1&$sub&$file), 0) ElseIf Not $ok1 And $ok2 Then addToDiff($diff, 1, $sub&$file, False, True, 0, FileGetSize($root2&$sub&$file)) EndIf EndIf Next ; Comparaison $folders Local $foldersToCompare = $vide For $i = 1 To $folders[0] Local $folder = $folders[$i] If ($filterForFolders = "" Or StringRegExp($folder, $filterForFolders)) And ($excludeFromFolders = "" Or Not StringRegExp($folder, $excludeFromFolders)) Then Local $ok1 = FileExists($root1&$sub&$folder), $ok2 = FileExists($root2&$sub&$folder) If $ok1 And $ok2 Then $foldersToCompare[0] = $foldersToCompare[0]+1 ReDim $foldersToCompare[$foldersToCompare[0]+1] $foldersToCompare[$foldersToCompare[0]] = $folder ElseIf $ok1 And Not $ok2 Then addToDiff($diff, 2, $sub&$folder, True, False, DirGetSize($root1&$sub&$folder), 0) ElseIf Not $ok1 And $ok2 Then addToDiff($diff, 2, $sub&$folder, False, True, 0, DirGetSize($root2&$sub&$folder)) EndIf EndIf Next ; Récursivité If $foldersToCompare[0] > 0 Then Local $percentScale = ($percentMax-$percentMin)/$foldersToCompare[0] For $i = 1 To $foldersToCompare[0] compare($diff, $root1, $root2, $filterForFiles, $excludeFromFiles, $filterForFolders, $excludeFromFolders, $sub&$foldersToCompare[$i]&"\", $percentMin+$percentScale*($i-1), $percentMin+$percentScale*$i) Next EndIf GUICtrlSetData($ProgressBar_Infos, $percentMax) EndFunc Func addToDiff(ByRef $diff, $val0, $val1, $val2, $val3, $val4, $val5) $diff[0][0] = $diff[0][0]+1 ReDim $diff[$diff[0][0]+1][6] $diff[$diff[0][0]][0] = $val0 $diff[$diff[0][0]][1] = $val1 $diff[$diff[0][0]][2] = $val2 $diff[$diff[0][0]][3] = $val3 $diff[$diff[0][0]][4] = $val4 $diff[$diff[0][0]][5] = $val5 EndFunc Func hash($file) Local $size = FileGetSize($file)&"-"&FileGetTime($file,0,1) If @error Then Return 0 Return $size EndFunc Func old_hash($file) Local $size = FileGetSize($file) If @error Then Return 0 Return $size EndFunc Func old_old_hash($file) Local $hash = _Crypt_HashFile($file, $CALG_MD5) If @error Then Return 0 Return $hash EndFunc