En revanche, un de mes deux pc ayant rendu sa carte graphique au grand fabriquant, la problématique a pour moi perdu un petit peu de son urgence !
Pour mémoire, je poste le code qui j'avais fait, je rappelle que je ne l'ai pas finis, et que je ne sais même plus qu'es-ce qui est fait, et ce qui ne l'ai pas.
Pour ajouter un dossier à surveiller, il faut cliquer droit dans le treegadget() de gauche.
Le programme fonctionne avec un partage simple entre pc, le répertoire distant étant accessible comme suis :
Code : Tout sélectionner
;{ structure
Structure DB
size.l
date_modif.l
date_create.l
dir.l
nom.s
MD5.s
EndStructure
Structure file_dir
file.s
dir.l
EndStructure
Structure main
win_hdl.l
win_title.s
win_flag.l
win_pos.POINT
win_size.SIZE
event.l
Map DB.DB()
List Dir.s()
etat.b
thread_analyse.l
thread_compare.l
etat_sauvegarde_BDD.b
thread_save_BBD.l
EndStructure
Structure Comparaison_dir
dir1.s
dir2.s
EndStructure
Enumeration ; Menus
#Menu_PopUp_Tree_dossiers_surveilles
EndEnumeration
Enumeration ; MenuItems
#Menu_Add
EndEnumeration
Enumeration ; Gadgets
#Gadget_Tree_dossiers_surveilles
#Gadget_Bouton_analyser
#Gadget_ProgressBar
#Gadget_Text_Nouveau
#Gadget_Tree_Nouveau
#Gadget_Bouton_comparer
#Gadget_Text_Modifier
#Gadget_Tree_Modifier
EndEnumeration
;}
;{ init
Global main.main
main\win_pos\x = 0
main\win_pos\y = 0
main\win_size\cx = 800
main\win_size\cy = 600
main\win_flag = #PB_Window_ScreenCentered | #PB_Window_SystemMenu
;}
;{ Procedures
Procedure RecursiveSafe_Directory(path$, List File.file_dir(), index_dir.l)
Protected NewList ToDo.s(), hd
If Right(path$, 1) <> "\" : path$ + "\" : EndIf
AddElement(ToDo())
ToDo() = path$
ResetList(ToDo())
While NextElement(ToDo())
path$ = ToDo()
DeleteElement(ToDo())
hd = ExamineDirectory(#PB_Any, path$, "*.*")
If hd
While NextDirectoryEntry(hd)
If DirectoryEntryType(hd) = #PB_DirectoryEntry_File
AddElement(File())
File()\file = path$ + DirectoryEntryName(hd)
File()\dir = index_dir
Else
If DirectoryEntryName(hd) <> "." And DirectoryEntryName(hd) <> ".."
; ajout du répertoire
AddElement(ToDo())
ToDo() = path$ + DirectoryEntryName(hd) + "\"
EndIf
EndIf
Wend
FinishDirectory(hd)
EndIf
SetGadgetText(#Gadget_Bouton_analyser, "Analyse : " + Str(ListSize(File())) + " découverts...")
ResetList(ToDo())
Wend
EndProcedure
Procedure Thread_Save_BDD(bla)
Protected file_hd
file_hd = CreateFile(#PB_Any, "DDB.db")
If file_hd
WriteLong(file_hd, ListSize(main\Dir()))
ForEach main\Dir()
WriteStringN(file_hd, main\Dir())
Next
WriteLong(file_hd, MapSize(main\DB()))
ForEach main\DB()
WriteLong(file_hd, main\DB()\date_create)
WriteLong(file_hd, main\DB()\date_modif)
WriteLong(file_hd, main\DB()\size)
WriteLong(file_hd, main\DB()\dir)
WriteStringN(file_hd, main\DB()\nom)
WriteStringN(file_hd, main\DB()\MD5)
Next
CloseFile(file_hd)
EndIf
main\etat_sauvegarde_BDD = #False
EndProcedure
Procedure Thread_Analyse_Dir(bla)
Protected a_final.l, a.l, dir$
Protected NewList File.file_dir()
Protected *pt_map_element.DB
; dressage de la liste des fichiers
ClearList(main\Dir())
a_final = CountGadgetItems(#Gadget_Tree_dossiers_surveilles) - 1
For a = 0 To a_final
dir$ = GetGadgetItemText(#Gadget_Tree_dossiers_surveilles, a)
AddElement(main\Dir())
main\Dir() = dir$
RecursiveSafe_Directory(dir$, File(), ListIndex(main\Dir()))
Next
; collecte d'infos sur les fichiers
ClearMap(main\DB())
SetGadgetAttribute(#Gadget_ProgressBar, #PB_ProgressBar_Maximum, ListSize(File()) - 1)
ForEach File()
SelectElement(main\Dir(), File()\dir)
*pt_map_element = AddMapElement(main\DB(), Right(File()\file, Len(File()\file) - Len(main\Dir())))
*pt_map_element\MD5 = MD5FileFingerprint(File()\file)
*pt_map_element\nom = Right(File()\file, Len(File()\file) - Len(main\Dir()))
*pt_map_element\dir = File()\dir
*pt_map_element\size = FileSize(File()\file)
*pt_map_element\date_create = GetFileDate(File()\file, #PB_Date_Created)
*pt_map_element\date_modif = GetFileDate(File()\file, #PB_Date_Modified)
SetGadgetState(#Gadget_ProgressBar, ListIndex(File()))
Next
SetGadgetText(#Gadget_Bouton_analyser, "Analyser")
main\etat_sauvegarde_BDD = #True
main\thread_save_BBD = CreateThread(@Thread_Save_BDD(), 0)
main\etat = 0
EndProcedure
Procedure Thread_Compare(bla)
NewMap *map_ref.DB()
NewMap *map_eva.DB()
NewMap *map_md5_ref.DB()
NewMap *map_md5_eva.DB()
NewList list_dir_ref.s()
NewList list_dir_eva.s()
;{ chargement des 2 BBD
DDB_file_ref = ReadFile(#PB_Any, "DDB_Init.db")
DDB_file_eva = ReadFile(#PB_Any, "DDB.db")
If DDB_file_eva = 0
If DDB_file_ref : CloseFile(DDB_file_ref) : EndIf
ProcedureReturn
EndIf
If DDB_file_ref = 0
If DDB_file_eva : CloseFile(DDB_file_eva) : EndIf
ProcedureReturn
EndIf
nb_dir_ref = ReadLong(DDB_file_ref)
nb_dir_eva = ReadLong(DDB_file_eva)
For a = 1 To nb_dir_ref
AddElement(list_dir_ref())
list_dir_ref() = ReadString(DDB_file_ref)
Next
For a = 1 To nb_dir_eva
AddElement(list_dir_eva())
list_dir_eva() = ReadString(DDB_file_eva)
Next
nb_map_elemen_ref = ReadLong(DDB_file_ref)
nb_map_elemen_eva = ReadLong(DDB_file_eva)
Dim array_dir_ref.DB(nb_map_elemen_ref)
Dim array_dir_eva.DB(nb_map_elemen_eva)
For a = 1 To nb_map_elemen_ref
array_dir_ref(a)\date_create = ReadLong(DDB_file_ref)
array_dir_ref(a)\date_modif = ReadLong(DDB_file_ref)
array_dir_ref(a)\size = ReadLong(DDB_file_ref)
array_dir_ref(a)\dir = ReadLong(DDB_file_ref)
array_dir_ref(a)\nom = ReadString(DDB_file_ref)
array_dir_ref(a)\MD5 = ReadString(DDB_file_ref)
AddMapElement(*map_ref(), array_dir_ref(a)\nom)
*map_ref() = @array_dir_ref(a)
AddMapElement(*map_md5_ref(), array_dir_ref(a)\MD5)
*map_md5_ref() = @array_dir_ref(a)
Next
For a = 1 To nb_map_elemen_eva
array_dir_eva(a)\date_create = ReadLong(DDB_file_eva)
array_dir_eva(a)\date_modif = ReadLong(DDB_file_eva)
array_dir_eva(a)\size = ReadLong(DDB_file_eva)
array_dir_eva(a)\dir = ReadLong(DDB_file_eva)
array_dir_eva(a)\nom = ReadString(DDB_file_eva)
array_dir_eva(a)\MD5 = ReadString(DDB_file_eva)
AddMapElement(*map_eva(), array_dir_eva(a)\nom)
*map_eva() = @array_dir_eva(a)
AddMapElement(*map_md5_eva(), array_dir_eva(a)\MD5)
*map_md5_eva() = @array_dir_eva(a)
Next
CloseFile(DDB_file_eva)
CloseFile(DDB_file_ref)
SortArray(array_dir_ref(), #PB_Sort_Ascending)
SortArray(array_dir_eva(), #PB_Sort_Ascending)
;}
ClearGadgetItems(#Gadget_Tree_Nouveau)
ClearGadgetItems(#Gadget_Tree_Modifier)
SetGadgetAttribute(#Gadget_ProgressBar, #PB_ProgressBar_Maximum, nb_map_elemen_eva + nb_map_elemen_ref)
For a = 1 To nb_map_elemen_eva
*pt.DB = FindMapElement(*map_ref(), array_dir_eva(a)\nom)
If *pt ; un fichier du même nom existe
; on teste donc l'égalité des contenus
*pt = FindMapElement(*map_md5_ref(), array_dir_eva(a)\MD5)
If *pt ; un fichier identique au sens de la MD5 existe
; --> on ne fait rien
Else
; le fichier n'a pas d'équal, il a donc été modifié
AddGadgetItem(#Gadget_Tree_Modifier, -1, "MODIF : " + array_dir_eva(a)\nom)
EndIf
Else
; on n'a pas trouver de fichier avec le même nom, il est donc nouveau ou renommer
*pt = FindMapElement(*map_md5_ref(), array_dir_eva(a)\MD5)
If *pt ; un fichier identique au sens de la MD5 existe
AddGadgetItem(#Gadget_Tree_Modifier, -1, "RENOM : " + array_dir_eva(a)\nom)
Else
; le fichier est nouveau (ou modifier + renommer)
AddGadgetItem(#Gadget_Tree_Modifier, -1, "NEW : " + array_dir_eva(a)\nom)
EndIf
EndIf
SetGadgetState(#Gadget_ProgressBar, a)
Next
For a = 1 To nb_map_elemen_ref
*pt.DB = FindMapElement(*map_eva(), array_dir_ref(a)\nom)
If *pt = 0
; on n'a pas trouver de fichier avec le même nom, il est donc nouveau ou renommer
*pt = FindMapElement(*map_md5_eva(), array_dir_ref(a)\MD5)
If *pt = 0
; le fichier est supprimé
AddGadgetItem(#Gadget_Tree_Modifier, -1, "SUPPR : " + array_dir_ref(a)\nom)
EndIf
EndIf
SetGadgetState(#Gadget_ProgressBar, nb_map_elemen_eva + a)
Next
main\etat = 0
EndProcedure
;}
main\win_hdl = OpenWindow(#PB_Any, main\win_pos\x, main\win_pos\y, main\win_size\cx, main\win_size\cy, main\win_title, main\win_flag)
If main\win_hdl
TreeGadget(#Gadget_Tree_dossiers_surveilles, 10, 10, 200, main\win_size\cy - 80)
CreatePopupMenu(#Menu_PopUp_Tree_dossiers_surveilles)
MenuItem(#menu_Add, "Ajouter un dossier")
ButtonGadget(#Gadget_Bouton_analyser, 10, main\win_size\cy - 60, 200, 20, "Analyser")
ProgressBarGadget(#Gadget_ProgressBar, 10, main\win_size\cy - 30, main\win_size\cx - 20, 20, 0, 1000, #PB_ProgressBar_Smooth)
TextGadget(#Gadget_Text_Nouveau, 220, 10, 200, 20, "Fichiers créés", #PB_Text_Border | #PB_Text_Center)
TreeGadget(#Gadget_Tree_Nouveau, 220, 40, 200, main\win_size\cy - 110, #PB_Tree_CheckBoxes|#PB_Tree_ThreeState)
ButtonGadget(#Gadget_Bouton_comparer, 220, main\win_size\cy - 60, 200, 20, "Comparer")
TextGadget(#Gadget_Text_Modifier, 430, 10, 200, 20, "Fichiers modifiés", #PB_Text_Border | #PB_Text_Center)
TreeGadget(#Gadget_Tree_Modifier, 430, 40, 200, main\win_size\cy - 80, #PB_Tree_CheckBoxes|#PB_Tree_ThreeState)
Else
End
EndIf
Repeat
main\event = WaitWindowEvent()
Select main\event
Case #PB_Event_Gadget
;{ GADGETs
If main\etat = 0 And main\etat_sauvegarde_BDD = #False
Select EventGadget()
Case #Gadget_Tree_dossiers_surveilles
;{ Tree dossiers surveilles
Select EventType()
Case #PB_EventType_RightClick
DisplayPopupMenu(#Menu_PopUp_Tree_dossiers_surveilles, WindowID(main\win_hdl))
EndSelect
;}
Case #Gadget_Bouton_analyser
;{ analyse
main\etat = 1
main\thread_analyse = CreateThread(@Thread_Analyse_Dir(), 0)
;}
Case #Gadget_Bouton_comparer
;{ comparaision
main\etat = 1
main\thread_compare = CreateThread(@Thread_Compare(), 0)
;}
EndSelect
EndIf
;}
Case #PB_Event_Menu
;{ MENUs
Select EventMenu()
Case #menu_Add
dir$ = PathRequester("Indiquez un dossier à surveiller", "")
If dir$
AddGadgetItem(0, -1, dir$)
EndIf
EndSelect
;}
EndSelect
Until main\event = #PB_Event_CloseWindow
End
; IDE Options = PureBasic 5.10 (Windows - x86)
; CursorPosition = 354
; FirstLine = 118
; Folding = -Ft
; EnableThread
; EnableXP