Ar-S a écrit :
J'aimerai que le message Sauvegarde réalisé avec succes s'affiche une fois le transfert terminé (histoire d'être sûr) or là il s'affiche dés que la copie commence.
Pour ca, je vois 2 solutions.
Soit tu comptes le nombre de fichier du répertoire source et tu compares avec le nombre de fichiers présent dans le répertoire destination. Pour ca il faut que tu sois sûr que le réperoire destination soit vide à chaque fois (répertoire différent à chaque sauvegarde ou suppression préalable des données). Je ne crois pas que c'est ce que tu cherches à faire...
Soit tu compares les fichiers des répertoires sources et destinations.
Voilà ce que je peux te proposer. Je l'ai testé chez moi, ca marche. Il y a peut - être (surement) plus simple.
Le code :
Code : Tout sélectionner
; Permet de copier 2 répertoires et attends jusqu'à ce que la copie soit effectuée
; ou qu'un TimeOut se déclenche
; -----------------------------
; Auteur : Cls
; Version : 12 Juin 2007
; -----------------------------
; Compare le contenu de 2 répertoires
; Renvoi le nombre de fichiers copiés
Procedure.l Compare_Directory(source.s, destination.s, rek = 0) ; Source, Destination, indice
res.l
; Ajoute les ""
If Right(destination, 1) <> "" : destination + "" : EndIf
If Right(source, 1) <> "" : source + "" : EndIf
If ExamineDirectory(rek, source, "*") And ExamineDirectory(rek + 1, destination, "*")
While NextDirectoryEntry(rek)
; Nom & Type répertoire source
s_name.s = DirectoryEntryName(rek) : s_type = DirectoryEntryType(rek)
; Teste si il y a encore une entrée dans le répertoire destination. Si non, renvoi Faux.
If NextDirectoryEntry(rek+1) = 0
ProcedureReturn 0
EndIf
; Nom & Type répertoire destination
d_name.s = DirectoryEntryName(rek + 1) : d_type = DirectoryEntryType(rek + 1)
Select s_type
Case #PB_DirectoryEntry_File
s_fullname.s = source + s_name
d_fullname.s = destination+ d_name
If s_name = d_name
res + 1
EndIf
Case #PB_DirectoryEntry_Directory
If s_name <> "." And s_name <> ".."
res + Compare_Directory(source + s_name + "", destination + d_name + "", rek + 2)
EndIf
EndSelect
Wend
;Libère la mémoire
FinishDirectory(rek)
FinishDirectory(rek + 1)
EndIf
ProcedureReturn res
EndProcedure
; Lance le thread comparant les 2 répertoires
Procedure Compare_DirectoryThread(mem.l)
; Récupère les paramètres du thread
source.s = PeekS(mem + 4) ; on lit un string a partir de mem + 4
destination.s = PeekS(mem + Len(source) + 5)
delay = PeekL(mem) ; long codé sur 4 byte
a = ElapsedMilliseconds()
; Test le fin du transfert ou le timeOut
While Compare_Directory(source, destination) < 1 Or b - a > delay
b = ElapsedMilliseconds()
Wend
EndProcedure
;- [Configuration de la copie]
Delay = 50 * 1000 ; Le timeout en millisecondes (ici 50 seondes)
Source.s = "C:\Test" ; Le répertoire source à copier
Destination.s = "C:\Test2" ; Le répertoire destination
; Zone mémoire permettant de configurer le thread (Delay, Source, Destination)
*buf = AllocateMemory(4096)
PokeL(*buf, Delay) ; 3000ms de delay
PokeS(*buf + 4, Source)
PokeS(*buf + Len(Source) + 5, Destination)
;- [Lancement de la copie]
debut = ElapsedMilliseconds()
CopyDirectory(Source, Destination, "*.*", #PB_FileSystem_Recursive | #PB_FileSystem_Force)
; Lance le thread permettant de savoir si le répertoire est copié
CreateThread(@Compare_DirectoryThread(), *buf)
fin = ElapsedMilliseconds()
delta = fin - debut
;- [Message]
If delta > Delay
MessageRequester("Erreur", "Erreur lors du transfert.")
Else
MessageRequester("Ok", "Fichiers copiés avec succès en " + Str(delta) + " ms.")
EndIf
Edit : Je viens de me rendre compte en me relisant que le thread ne servait à rien, j'avais commencé à faire autrement puis j'ai changé...
Comme j'ai la flemme de remodifier le code je le laisse tel quel.
Cordialement,
Cls