Je vous partage un script de synchro de dossiers. Utile pour vos projets logiciels, ou vos bibliothèques photos/vidéos. Le principe est simple, choisir deux répertoires et les comparer, savoir quels fichiers ou dossiers manquent dans l'un ou dans l'autre, ou encore quels fichiers sont en conflits. Voici le script :
► Afficher le texteComparaison.au3
Code : Tout sélectionner
#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 <Array.au3>
#Include <Crypt.au3>
#Include <File.au3>
; Extended
#include <GuiImageList.au3>
#Include <WindowsConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <StaticConstants.au3>
#Include <GuiListView.au3>
#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
- Lancer le script
- Cliquez sur le bouton "Dossier de gauche" pour choisir un premier dossier racine à comparer
- Cliquez sur le bouton "Dossier de droite" pour choisir un second dossier racine à comparer
- Cliquez ensuite sur "Scan" pour lancer une comparaison des deux ressources sélectionnées
- Vous voyez maintenant dans la listview tous les fichiers et dossiers qui ne sont pas identiquement traités dans ces deux dossiers, avec pour chacun une remarque expliquant la différence :
- Dossier/fichier manquant à gauche
- Dossier/fichier manquant à droite
- Dossiers/fichiers en conflit
- ...
- Sélectionnez les fichiers/dossiers à traiter avec les checkbox
- Faites un clic droit sur la listview pour faire apparaitre les options possibles :
- Copier vers la gauche/droite
- Supprimer à gauche/droite
- Tout supprimer (pas encore codée)
- Tout synchroniser (idem, à faire)
- Ouvrir le(s) dossier(s)
- Pour chaque option choisie, vous aurez un message récapitulatif et de confirmation avec la taille traitée, le nombre de fichiers écrasés ou ignorés, etc...
- Validez et laissez faire la procédure (qui peut être assez longue si vous avez des gigas à traiter ^^)
- Un message à la fin de la procédure vous indiquera si la copie s'est bien passée, et voila !
Code : Tout sélectionner
FiltreFichiers=\.(avi|mp4|mkv)$
ExclusionFichiers=
FiltreDossiers=
ExclusionDossiers=^(\$RECYCLE\.BIN|System Volume Information|found\.\d+)$
PS: Pour faire apparaître les paramètres de config, il se peut que vous deviez lancer le script puis le quitter (pour créer le fichier) et le relancer pour pouvoir voir les données en question.
EDIT : Petit tuyau en passant, comme dans beaucoup de mes scripts à base de listview, un clic sur l'entête de la première colonne permet d'inverser la sélection. Quand on a plein de fichiers à sélectionner sauf deux ou trois, c'est pratique. Sur les autres colonnes (comme les deux suivantes qui forment des cases orange ou rouges), cela permet de trier les résultats.