Prog de synchro

Programmation d'applications complexes
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Prog de synchro

Message par graph100 »

Bonjour Walter,

Tout d'abord bienvenu sur le forum :D et merci pour cette réponse complète et réfléchie !

Ta réponse amène une réflexion ordonnée et pratique sur le problème (ça serai tellement bien que certains en prennent de la graine :twisted: )
En revanche, le manque de temps, et mes activités du moment ne me permettront pas de développer plus avant (en tout cas pour le moment), ce petit projet !

Graph100
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Prog de synchro

Message par Backup »

@walter
une réponse 1 ans apres le dernier message du topic ...

bonjour le déterrage :lol:

mais bon ..le problème lui ne vieilli pas .. n'est ce pas ? :)
walter
Messages : 2
Inscription : jeu. 07/mars/2013 18:27
Localisation : Guadeloupe

Re: Prog de synchro

Message par walter »

@dobro

effectivement je n'avais pas fait attention à la date ;o))
Mais bon, y en a qui regarde ;o))

@graph100

Merci,
ça m'a donné envie d'y réfléchir un peu, je vais voir ce que je peux faire.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Prog de synchro

Message par graph100 »

Comme tu le dis si bien à la fin, le problème ne vieillit pas :wink:

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 :
//reseau_pc/repertoire/blabla/

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
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre