Le principe est plutôt simple. Lors de chaque copie du fichier source vers la destination, si le fichier source est différent de la destination, alors le fichier se trouvant sur la destination est renommé avec un numéro de révision (Fichier(1).txt), puis la source est copiée sur la destination.
► Afficher le texteScript
Code : Tout sélectionner
#include <File.au3>
#include "FileListToArray3.au3"
; UDF à télécharger ici : http://www.autoitscript.com/forum/index.php?showtopic=49396
; Paramètrage du dossier source/destination et du masque de recherche des fichiers.
Dim $Src = ".\Dir1"
Dim $File = "*"
Dim $Dst = ".\Dir2"
Dim $szDrive, $szDir, $szFName, $szExt
; Fonction de mise en tableau des fichiers recherchés.
; _FileListToArray3($sPath, $sFilter = "*", $iFlag = 0, $iRecurse = 0, $iBaseDir = 1, $sExclude = "", $i_Options = 1)
$aFiles = _FileListToArray3($Src, $File, 1, 1, 0, 0)
; Boucle de lecture du nom des fichiers.
For $i = 1 To $aFiles[0]
; Décomposition du nom des fichiers.
_PathSplit($aFiles[$i], $szDrive, $szDir, $szFName, $szExt)
$SrcFile = $Src & "\" & $szDrive & $szDir & $szFName & $szExt
$DstFile = $Dst & "\" & $szDir & $szFName & $szExt
; Si le fichier de destination existe alors ...
If FileExists($DstFile) Then
; Comparaison des fichiers (date et taille)
If _FilesCompare($SrcFile, $DstFile) And not @error Then
; Si les fichiers sont différents alors création du nom de révision.
$RevisionFile = _GetIncrementName($SrcFile, $DstFile)
; On renomme l'ancien fichier en fichier révision
FileMove($DstFile, $RevisionFile, 8)
; On copie la source vers la destination.
FileCopy($SrcFile, $DstFile, 8)
Else
; Si erreur de paramètre :
MsgBox(16, "Error", "Error in function call. Check " & @CRLF & _
"Source/Destination files and compare mode ...")
EndIf
Else
; Si pas de fichier identique sur la destination, copie du fichier
FileCopy($SrcFile, $DstFile, 8)
EndIf
Next
; Fonction pour obtenir un nom incrémental de la destination
Func _GetIncrementName($vSrcFile, $vDstFile)
Local $Count = 1
; Récupère tous les éléments du fichier de destination (dans le but de rajouter un nombre d'incrémentation).
_PathSplit($vDstFile, $szDrive, $szDir, $szFName, $szExt)
; 1st incrément du fichier.
$vDstFile = $szDrive & $szDir & $szFName & "(" & $Count & ")" & $szExt
; Boucle d'incrémentation du nom de la destination.
While FileExists($szDrive & $szDir & $szFName & "(" & $Count & ")" & $szExt)
$Count += 1
$vDstFile = $szDrive & $szDir & $szFName & "(" & $Count & ")" & $szExt
WEnd
Return $vDstFile
EndFunc ;==>_GetIncrementName
; $fSrc est le fichier source.
; $fDst est le fichier de destination.
; $Mode est le mode de comparaison :
; 0 = Comparaison date dernière modif + taille
; 1 = Comparaison avec la commande DOS FC.exe.
; Vous pouvez ajouter votre propre méthode de comparaison dans cette fonction.
Func _FilesCompare($fSrc, $fDst, $Mode = 0)
; Si source ou destination innexistante => Erreur
If Not FileExists($fSrc) or Not FileExists($fDst) Then
SetError(1)
Return 1
EndIf
; Mode 0 (defaut) : Compare date et taille.
If $Mode = 0 Then
If (FileGetTime($fSrc, 0, 1) <> FileGetTime($fDst, 0, 1)) Or (FileGetSize($fSrc) <> FileGetSize($fDst)) Then
Return 1
Else
Return 0
EndIf
; Mode 1 : Comparaison avec l'utilitaire DOS FC.exe
ElseIf $Mode = 1 Then
Return RunWait(@ComSpec & ' /c ' & 'FC "' & $fSrc & '" "' & $fDst & '"', "", @SW_HIDE )
; Si le mode est incorrect => Erreur.
Else
SetError(2)
Return 1
EndIf
endfunc