De retour ici avec un problème... en gros parfois la copie fonctionne, parfois non !
Le debug m'affiche parfois une erreur sur un SetSkinItemText , mais pas tout le temps !
J'ai très probablement du me mélanger les pinceaux coté thread/timer mais je vois pas top comment rendre tout cela plus propre.
Voilà une version allégée du code (j'ai supprimé les prefs, les tests pour voir si source<destination etc..)
le code utilise aussi les commandes getdirectorySize() et MakeSureDirectoryExist() de la Droopy libs.
Donc il n'est pas "totalement" exploitable.
Si vous avez le temps de jeter un oeil dedans et si vous voyez ce qui cloche, ce serait sympa de m'en faire part.
Code : Tout sélectionner
UsePNGImageDecoder()
Enumeration
#wincode
#NOM
#CLE1
#Text_Nom
#Text_CLE
#enregistrer
#Enr_Annuler
#Text_DEVER
#Timer1
EndEnumeration
Declare About()
Declare TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Declare S_Etape1()
Declare S_Etape2()
Declare COPYdir()
Declare GOCOPY(*ldvmultimedia)
Declare.s recupeDate()
declare CacheACCUEIL()
declare AffichACCUEIL()
declare AffichSAUVER()
declare CacheSAUVER()
declare.q GetDiskFreeSpace(Lecteur.s, Type.l = 0)
declare.s DisplayDiskFreeSpace(Taille.q, Unite.l = -1, NbDecimals.l = -1)
;Inclusion des images datas
IncludeFile("skin.pbi") ; Insertion des datas
; Chargement des images
img_Normal=CatchImage(10, ?n_img)
img_Select=CatchImage(11, ?s_img)
img_Item=CatchImage(12, ?i_img)
; Chargement de la font
arialBig=LoadFont(100,"arial",16,#PB_Font_HighQuality)
arialMed=LoadFont(101,"arial",12,#PB_Font_Bold|#PB_Font_HighQuality)
Global AUTOQUIT$,FINPERIODE$,SOURCE$,DEST$,LASTSAVNAME$,LASTSAVDATE$,LIC$,USER$,LecteurDEST$,DernierRep$,Apropos$,lancement$,pass$,lancrypt$
Global DefRep$,Pref$
Global Date$,Time$,LaDate$,bilan$,trial
Global RC.s=chr(10)
Global CacheACCUEIL,CacheSAUVER,SS,SD
Global v$="1.0 alpha 8 build 17"
Global RepAcopier$
GLOBAL GOCOPY=0
GLOBAL ANNUL=0
global taille
global TUE_THREAD
Global TailleSOURCE.q,TailleDEST.q,afficheBARRE,Full.l
afficheBARRE=0
TUE_THREAD=0
TailleSOURCE=0
TailleDEST=0
DefRep$=GetCurrentDirectory()
; ------COULEUR DES ITEMS--------
#C_ACCUEIL=$9999CC
#C_SAUVER=$6666CC
;#C_QUITTER=$99CCCC
#C_X=$66CCCC
#C_APROPOS=$339999
#C_EDITOR=$336666
#C_HORIZONTAL=$333333
#C_Fond=$CC00FF
; ------------------------------
;QuoiLister
#dossier = #PB_DirectoryEntry_Directory
#fichier = #PB_DirectoryEntry_File
#all = -1
;Mode (afficher les extensions pour les fichiers ou pas)
#EXToui=1
#EXTnon=0
Directory$ = "c:\"
If CreateSkinWindow(0, #PB_Ignore, #PB_Ignore, titre$, #PB_Window_ScreenCentered|#PB_Window_Invisible, 0, 10, 11, 11, 11, 10, 12, 12, 0,0)
Handle = WindowID (0)
StickyWindow(0,1)
SkinItemMoveWindow(#C_Fond, 1)
HideSkinWindow(0, 0)
EditorGadget(1,SkinItemX(#C_EDITOR),SkinItemY(#C_EDITOR),SkinItemWidth(#C_EDITOR),SkinItemHeight(#C_EDITOR))
SetGadgetFont(1,fontID(101))
RetourAuto(1)
SetGadgetText(1,bilan$)
;-GADGETs CLASSIQUEs---------------
;Global
Frame3DGadget(3,SkinItemX(#C_EDITOR),SkinItemY(#C_EDITOR),SkinItemWidth(#C_EDITOR),SkinItemHeight(#C_EDITOR),TXTframe$)
;SAUVE-----------------------------------------------
;Etape 1
TextGadget(4, SkinItemX(#C_EDITOR)+10, SkinItemY(#C_EDITOR)+30, 355, 20, "ETAPE 1 - Sélectionnez le répertoire que vous voulez sauvegarder.", #SS_CENTERIMAGE)
ButtonGadget(10, SkinItemX(#C_EDITOR)+10, SkinItemY(#C_EDITOR)+55, 365, 25, "Choisir le répertoire à sauvegarder")
SetGadgetFont(10,FontID(101))
StringGadget(6, SkinItemX(#C_EDITOR)+10, 160, 365, 20, "Ici apparaitra le chemin du répertoire que vous voulez sauvegarder.", #PB_String_ReadOnly|#ES_CENTER)
; Etape 2
TextGadget(5, SkinItemX(#C_EDITOR)+10, SkinItemY(#C_EDITOR)+140, 282, 22, "ETAPE 2 - Sélectionnez le répertoire de déstinnation", #SS_CENTERIMAGE)
ButtonGadget(9, SkinItemX(#C_EDITOR)+10, SkinItemY(#C_EDITOR)+170, 365, 25, "Choisir l'endroit ou sera sauvé le répertoire")
SetGadgetFont(9,FontID(101))
StringGadget(7, SkinItemX(#C_EDITOR)+10, SkinItemY(#C_EDITOR)+200, 365, 19, "Ici apparaitra le chemin du répertoire de destination", #PB_String_ReadOnly|#ES_CENTER)
;créer la sauvegarde
ButtonGadget(8, SkinItemX(#C_EDITOR)+10, 350, 365, 75, "Créer la sauvegarde maintenant !")
SetGadgetFont(8,FontID(101))
CacheACCUEIL=0
CacheSAUVER()
;FOOTER
SetSkinItemText(#C_HORIZONTAL,"Bienvenue sur LDV MULTIMEDIA Sauvegarde Facile !")
SetSkinItemFont(#C_HORIZONTAL,FontID(100),$00,$00)
;-Lance le TIMER
SetTimer_(Handle, #timer1 , 500, @TimerProc())
Repeat
if TUE_THREAD=1
if IsThread(thread)<>0
KillThread(thread)
endif
If CacheSAUVER=0
CacheSAUVER()
EndIf
if CacheACCUEIL=1
AffichACCUEIL()
EndIf
TUE_THREAD=0
EndIf
;-EVENEMENTS--------------------
;-*-- LES GADGETS SKIN ------
Event = WaitSkinWindowEvent()
Select EventSkinItem()
Case #C_APROPOS
About()
Case #C_X
End
;{-ACCUEIL
Case #C_ACCUEIL
If CacheSAUVER=0
CacheSAUVER()
EndIf
if CacheACCUEIL=1
AffichACCUEIL()
EndIf
SetGadgetText(1,bilan$)
;}
;{-SAUVER
Case #C_SAUVER
if CacheACCUEIL=0
CacheACCUEIL()
endif
if CacheSAUVER=1
AffichSAUVER()
endif
SetSkinItemText(#C_HORIZONTAL,"Commencez par l'étape 1")
;}
DisableGadget(10,0)
DisableGadget(8,1) ; GO
DisableGadget(9,1)
EndSelect
;-*-- LES GADGETS CLASSIQUES------
GadgetEvent=WindowEvent()
Select EventGadget()
Case 10 ; Bouton source
S_Etape1()
Case 9 ; Bouton destination
S_Etape2()
case 8 ; bouton COPY
COPYdir()
If GOCOPY=1
;--Vérifie que source < Lecteur destination----
debug "Source : "+SOURCE$
PoidsSource$=str(GetDirectorySize(SOURCE$))
debug "Poids : "+PoidsSource$
LecteurDEST$=Mid(DEST$,1,3)
debug "lecteur DEST$ : "+LecteurDEST$
PoidsDEST$=DisplayDiskFreeSpace(GetDiskFreeSpace(LecteurDEST$, 0))
debug "Espace restant : "+PoidsDEST$
if val(PoidsSource$)<val(PoidsDEST$)
;Désactivation des boutons pendant la copie
DisableGadget(8,1)
DisableGadget(9,1)
DisableGadget(10,1)
TailleSOURCE=GetDirectorySize(SOURCE$)
afficheBARRE=1
thread=CreateThread(@GOCOPY(),200)
debug GOCOPY
else
GOCOPY=0
SetSkinItemText(#C_HORIZONTAL,"Copie impossible, plus assez de place sur "+LecteurDEST$)
DisableGadget(9,1)
endif
elseif GOCOPY=0
if IsThread(thread)<>0
KillThread(thread)
endif
elseif ANNUL=1
EndIf
EndSelect
Until event = #PB_Event_CloseWindow
EndIf
;-FIN EVENEMENTS-------------------------
; Auteur : Le Soldat Inconnu
Procedure.q GetDiskFreeSpace(Lecteur.s, Type.l = 0)
; lecteur = nom du lecteur
; type = choix de la réponse, 0 = espace libre sur le lecteur, 1 = taille du lecteur
Protected EspaceLibre.q, Taille.q, resultat.q
GetDiskFreeSpaceEx_(Lecteur, @EspaceLibre, @Taille, 0)
Select Type
Case 0 : resultat = EspaceLibre
Case 1 : resultat = Taille
EndSelect
ProcedureReturn resultat
EndProcedure
Procedure.s DisplayDiskFreeSpace(Taille.q, Unite.l = -1, NbDecimals.l = -1)
Protected Val.q, Txt.s
If Unite = -1
NbDecimals = 0
Unite = 1
Val = 1024
EndIf
ProcedureReturn StrF(Taille / Val, NbDecimals)
EndProcedure
Procedure.s RecupeDate()
Date$ = FormatDate("%dd/%mm/%yyyy", Date())
Time$ = FormatDate("%hh:%ii", Date())
LaDate$=Date$+ " à "+Time$
ProcedureReturn LaDate$
EndProcedure
;{- PROCEDURES SAUVEGARDES
;-**Etape 1
procedure S_Etape1()
if SOURCE$=""
SOURCE$="c:\"
EndIf
RepAcopier$=PathRequester("Répertoire à sauvegarder",SOURCE$)
If RepAcopier$
debug RepAcopier$
SOURCE$=RepAcopier$
; Nom du dernier repertoire
DernierRep$=ReverseString(RepAcopier$)
PosSlash=FindString(DernierRep$,"\",3)
DernierRep$=mid(DernierRep$,2,PosSlash-2)
DernierRep$=ReverseString(DernierRep$)
DernierRep$+"\"
debug "Dernier Rep : "+DernierRep$
SetGadgetText(6,SOURCE$)
SetSkinItemText(#C_HORIZONTAL,"Passez maintenant à l'étape 2")
DisableGadget(9,0)
else
SetSkinItemText(#C_HORIZONTAL,"Annulé par l'utilisateur")
EndIf
EndProcedure
;-** Etape 2
procedure S_Etape2()
RepCible$=PathRequester("Répertoire de destination","c:\")
If RepCible$
DEST$=RepCible$
SetGadgetText(7,DEST$)
SetSkinItemText(#C_HORIZONTAL,"Vous pouvez lancer la copie")
DisableGadget(8,0)
else
SetSkinItemText(#C_HORIZONTAL,"Annulé par l'utilisateur")
EndIf
EndProcedure
;-** COPYdir
Procedure COPYdir()
ANNUL=0
QuestionSav=MessageRequester("Résumé","Répertoire source : "+rc+SOURCE$+rc+rc+"Répertoire de destination : "+rc+DEST$+DernierRep$+rc+rc+"Souhaitez vous ajouter 'la date' en sous repertoire pour votre sauvegarde ?"+rc+"(nous vous conseillons d'utiliser cette option)"+rc+"Ce qui donnerait : "+rc+DEST$+FormatDate("%yyyy_%mm_%dd", Date())+"\"+DernierRep$,#PB_MessageRequester_YesNoCancel|#MB_ICONINFORMATION ) ;
If QuestionSav = 6 ; oui
DEST$+FormatDate("%yyyy-%mm-%dd", Date())+"\"+DernierRep$
GOCOPY=1
elseif QuestionSav=7
GOCOPY=1
DEST$+DernierRep$
else
GOCOPY=0
SetSkinItemText(#C_HORIZONTAL,"Annulé par l'utilisateur")
ANNUL=1
EndIf
EndProcedure
;-** GOCOPY
Procedure GOCOPY(*ldvmultimedia)
MakeSureDirectoryPathExists(DEST$) ; DroopyLib - Si vous ne l'avez pas, soyez sur que le rep destination existe
Copiage = CopyDirectory(SOURCE$, DEST$, "" ,#PB_FileSystem_Recursive|#PB_FileSystem_Force)
if Copiage=0
SetSkinItemText(#C_HORIZONTAL,"Impossible de copier le répertoire source !")
afficheBARRE=0 : GOCOPY=0 : TUE_THREAD=1
else
SetSkinItemText(#C_HORIZONTAL,"La copie est terminée")
Date$ = FormatDate("%dd/%mm/%yyyy", Date())
Time$ = FormatDate("%hh:%ii", Date())
LaDate$=Date$+ " à "+Time$
afficheBARRE=0
TailleSOURCE=0
TailleDEST=0
GOCOPY=0
TUE_THREAD=1
EndIf
ProcedureReturn TUE_THREAD
EndProcedure
; PROCEDURES D'AFFICHAGE/MASQUAGE des gadgets
Procedure AffichACCUEIL()
HideGadget(1,0)
HideGadget(3,1)
CacheACCUEIL=0
ProcedureReturn CacheACCUEIL
EndProcedure
Procedure CacheACCUEIL()
HideGadget(1,1)
CacheACCUEIL=1
ProcedureReturn CacheACCUEIL
EndProcedure
Procedure CacheSAUVER()
For i = 4 to 10
Hidegadget(i,1)
next
HideGadget(3,1)
CacheSAUVER=1
ProcedureReturn CacheSAUVER
EndProcedure
Procedure AffichSAUVER()
For i = 4 to 10
Hidegadget(i,0)
next
HideGadget(3,0)
CacheSAUVER=0
ProcedureReturn CacheSAUVER
EndProcedure
Procedure About()
If CacheSAUVER=0
CacheSAUVER()
EndIf
if CacheACCUEIL=1
AffichACCUEIL()
EndIf
Apropos$=" LDV MULTIMEDIA - Sauvegarde Facile !"+rc+rc
SetGadgetText(1,Apropos$)
EndProcedure
;-PROCEDURE TIMER
;Original : Dobro
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Select uMsg
Case #WM_TIMER
Select idEvent
Case #timer1
if afficheBARRE=1
TailleDEST=GetDirectorySize(DEST$)
if TailleDEST<>TailleSOURCE
debug "source : "+SOURCE$
debug "taille :"+str(TailleSOURCE)
debug "Dest : "+DEST$
debug "poids :"+str(TailleDEST)
Full=TailleSOURCE-TailleDEST
debug "Progression : "+str(Full)
SetSkinItemText(#C_HORIZONTAL,"copie en cours : "+str(Full))
else
afficheBARRE=0
EndIf
endif
EndSelect
EndSelect
EndProcedure