Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.



Documents pareils
Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Optimisation de 4D Server et 4D Web Server. Résumé. 4D Notes techniques

Service d information pour remise de paiement de factures Scotia

4e Dimension Clés XML Backup. Windows /Mac OS 4e Dimension D SA. Tous droits réservés.

Réaliser un PUBLIPOSTAGE

Single User. Guide d Installation

Capture Pro Software. Démarrage. A-61640_fr

Manuel d'utilisation de Mémo vocal

Instructions préliminaires P2WW FR Préface

Utilisation de l ordinateur portable Bluetooth avec le hub Logitech sans fil

Fonctions pour la France

Notice d'utilisation Site Internet administrable à distance

FICHE 17 : CREER UN SITE WEB

Fonctions pour la Suisse

Corrigé de l'atelier pratique du module 8 : Implémentation de la réplication

Formation. Module WEB 4.1. Support de cours

Automatisation d'une Facture 4. Liste Déroulante Remises Case à cocher Calculs

La technologie au collège

Manuel d utilisation. Logiciel (Device Monitor) Pour les systèmes d imagerie numérique. Configuration requise Description générale

Manuel de l'application SMS

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

1 è r e étape : créer sa base de d o n n é e s

Cours 420-KEG-LG, Gestion de réseaux et support technique. Atelier No2 :

SOMMAIRE AIDE À LA CRÉATION D UN INDEX SOUS WORD. Service général des publications Université Lumière Lyon 2 Janvier 2007

Onglet sécurité de Windows XP Pro et XP Home

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Mode d emploi pour lire des livres numériques

LibreOffice Calc : introduction aux tableaux croisés dynamiques

Sophos Mobile Encryption pour Android Aide. Version du produit : 1.0

A lire en premier lieu

Sophos Mobile Encryption pour Android Aide. Version du produit : 1.3

GESTION DE L'ORDINATEUR

Database Manager Guide de l utilisateur DMAN-FR-01/01/12

Manuel d utilisation de Gestion 6

Tropimed Guide d'installation

Effectuer des changements par lots avec BCDI abonnement

Licence de Biologie, 1ère année. Aide. [Aide 1] Comment utiliser l'explorateur Windows? Comment créer des dossiers?

Stockez et créez vos documents

Juin XMS PC Connect Guide de l utilisateur

Win UR Archive. Manuel de l utilisateur. Version 3.0, mars 2009

Microsoft Hosted Exchange 2010 DOCUMENT D EXPLOITATION

GUIDE D'INSTALLATION DU LOGICIEL

MISE AU POINT FINANCIÈRE GUIDE DE L UTILISATEUR. Le logiciel MISE AU POINT FINANCIÈRE est offert sous licence par EquiSoft.

Guide Numériser vers FTP

Connecteur Zimbra pour Outlook 2007 et 2010 (ZCO) w

Sauvegarde d'une base de données SQL Server Express 2005

Configuration du nouveau Bureau Virtuel (BV) collaboratif de Lyon I

Comment utiliser FileMaker Pro avec Microsoft Office

Je communique par

Intégrer des notices de MoCCAM-en-ligne dans BCDI abonnement

Your Detecting Connection. Manuel de l utilisateur. support@xchange2.net

Clé USB Wi-Fi D-Link DWA-140

MEDIAplus elearning. version 6.6

CMS Modules Dynamiques - Manuel Utilisateur

Peut être utilisée à l intérieur du site où se trouve la liste de référence.

Comment faire des étiquettes

Publier dans la Base Documentaire

Installation et paramétrage. Accès aux modèles, autotextes et clip- art partagés

ecafé TM CENTER

HP Data Protector Express Software - Tutoriel 3. Réalisation de votre première sauvegarde et restauration de disque

4D v11 SQL. Mise à jour Windows /Mac OS. 4D D SAS. Tous droits réservés.

Utilisation de la clé USB et autres supports de stockages amovibles

Logiciel (Système d impression directe)

Publier un Carnet Blanc

Guide d'utilisation. OpenOffice Calc. AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons

Utiliser Glary Utilities

4D Server et les licences : fonctionnement et environnement

Service Informatique et Télématique (SITEL), Emile-Argand 11, 2009 Neuchâtel, Tél ,

COURS DE MS EXCEL 2010

AOLbox. Partage de disque dur Guide d utilisation. Partage de disque dur Guide d utilisation 1

Procédure d'installation de SQL Server Express 2008

Archivage de courriels avec Outlook ( )

GUIDE NSP Activation et gestion des produits avec NSP

COSWIN MOBILE SERVEUR DE SYNCHRONISATION GUIDE D INSTALLATION

Guide d'utilisation du Serveur USB

E.N.T. Espace Numérique de Travail

Numérisation. Copieur-imprimante WorkCentre C2424

Importer une bibliographie au format «texte» dans Zotero

Manuel d utilisation Logiciel (Communications Utility)

AGASC / BUREAU INFORMATION JEUNESSE Saint Laurent du Var - E mail : bij@agasc.fr / Tel : CONSIGNE N 1 :

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

01V96i Editor Manuel d'installation

Comment mettre en page votre livre

Télécharger et Installer OpenOffice.org sous Windows

Publipostage et étiquettes

Mac OS X 10.6 Snow Leopard Guide d installation et de configuration

Manuel d'utilisation de Palm BlueBoard 2.0

Parallels Transporter Lisez-moi

1. Utilisation du logiciel Keepass

Comment Utiliser les Versions, les Modification, les Comparaisons, Dans les Documents

Manuel de formation ActivExpression v2

On trouvera sur le site du CCDMD un exemple d album construit avec Cantare. (

NOTICE TELESERVICES : Demander un état hypothécaire

TD3 - Facturation avec archivage automatisé

Transcription:

Synchronisation de répertoires Par Gilles MELLOT, Responsable Notes Techniques Note technique 4D-200004-11-FR Version 1 Date 1 Avril 2000 Résumé Cette note technique fournit une bibliothèque de méthodes de catalogages de volumes, de manipulation et de synchronisation de répertoire, et ce, sous les deux OS. 4D Notes techniques Copyright 1985-2004 4D SA - Tous droits réservés Tous les efforts ont été faits pour que le contenu de cette note technique présente le maximum de fiabilité possible. Néanmoins, les différents éléments composant cette note technique, et le cas échéant, le code, sont fournis sans garantie d'aucune sorte. L'auteur et 4D S.A. déclinent donc toute responsabilité quant à l'utilisation qui pourrait être faite de ces éléments, tant à l'égard de leurs utilisateurs que des tiers. Les informations contenues dans ce document peuvent faire l'objet de modifications sans préavis et ne sauraient en aucune manière engager 4D SA. La fourniture du logiciel décrit dans ce document est régie par un octroi de licence dont les termes sont précisés par ailleurs dans la licence électronique figurant sur le support dulogiciel et de la Documentation afférente. Le logiciel et sa documentation ne peuvent être utilisés, copiés oureproduits sur quelque support que ce soit et de quelque manière que ce soit, que conformément aux termes de cette licence. Aucune partie de ce document ne peut être reproduite ourecopiée de quelque manière que ce soit, électronique ou mécanique, y compris par photocopie, enregistrement, archivage ou tout autre procédé de stockage, de traitement et de récupération d'informations, pour d'autres buts que l'usage personnel de l'acheteur, et ce exclusivement aux conditions contractuelles, sans la permission explicite de 4D SA. 4D, 4D Calc, 4D Draw, 4D Write, 4D Insider, 4ème Dimension, 4D Server, 4D Compiler ainsi que les logos 4e Dimension, sont des marques enregistrées de 4D SA. Windows,Windows NT,Win 32s et Microsoft sont des marques enregistrées de Microsoft Corporation. Apple, Macintosh, Power Macintosh, LaserWriter, ImageWriter, QuickTime sont des marques enregistrées ou des noms commerciaux de Apple Computer,Inc. Mac2Win Software Copyright 1990-2002 est un produit de Altura Software,Inc. 4D Write contient des éléments de "MacLink Plus file translation", un produit de DataViz, Inc,55 Corporate drive,trumbull,ct,usa. XTND Copyright 1992-2002 4D SA. Tous droits réservés. XTND Technology Copyright 1989-2002 Claris Corporation.. Tous droits réservés ACROBAT Copyright 1987-2002, Secret Commercial Adobe Systems Inc.Tous droits réservés. ACROBAT est une marque enregistrée d'adobe Systems Inc. Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs. 1 / 22

Introduction Cette note technique, outre le fait qu elle soit du mois d'avril, vous propose une bibliothèque de méthodes de manipulations de fichiers et de catalogue de volumes. Cas pratique examiné : la synchronisation de deux répertoires (ou volumes). Utilisation Après avoir quitté la procédure "Go_mac" ou Go_Win" (lançées sur ouverture base), sélectionnez l'item Synchronisation du Menu Fichier. Dans le groupe "définition de la synchro" deux icones/zônes vous permettent de choisir les répertoires devant êtres synchronisés. Une fois les répertoires sélectionnés, vous pouvez définir quel répertoire sera la cible ou la source en sélectionnant le bouton radio adéquat. Une boîte à cocher optionnelle, (en cas de synchronisation) supprimera les fichiers et dossiers n'existant pas dans le dossier source. ATTENTION : cette base exécute réellement la synchronisation, elle remplace et supprime de ce fait les dossiers et fichiers sélectionnés. Une fois vos répertoires ou volumes sélectionnés et le sens de la synchronisation déterminée, vous aurez la possibilité de cliquer sur le bouton Scanner... Votre formulaire devrait avoir cet aspect-là : 2 / 22

- Dossier existant - Fichier existant - Dossier devant être supprimé - Fichier devant être supprimé - Dossier devant être ajouté - Fichier devant être ajouté - Dossier devant être remplacé - Fichier devant être remplacé ATTENTION : aucun contrôle sur les dates ou versions. Si le fichier existe, il sera remplacé. 3 / 22

Suivant l'option demandée, les icônes de la liste hiérarchique cible vont changer : Une option sur la liste source, vous permet de supprimer les occurrences de fichiers ou dossiers ne devant pas être synchronisés. Note : la sélection d'un fichier (pas d'un dossier) activera la zone d'information située sous les listes hiérarchiques. Si votre projet vous convient, il ne vous reste plus qu'à cliquer sur "Synchroniser", pour effectuer le traitement sur vos répertoires... 4 / 22

5 / 22

Après la synchronisation, un scan des répertoires est de nouveau réalisé, afin de visualiser le travail effectué. Il vous est alors possible de définir une nouvelle synchronisation. Les méthodes de synchronisation Dans cette note technique, pour éviter de maintenir des tableaux décrivant les options de suppression, d'ajout ou de remplacement, nous nous servirons des icônes qui décrivent avant la synchro l'état des fichiers ou dossiers. Ce travail ayant été fait pendant le scan, il est inutile de recommencer le traitement. Note : il n'a pas été fait de test de rapidité de traitement entre un chercher dans tableau et un lire proprietes element. Nous ne vous proposons qu'une autre vision de gestion des listes hiérarchiques. Méthode objet Sélection du répertoire : Note : après le scan, si les deux répertoires sont renseignés, nous effectuons directement la comparaison. CommentRight:="" CommentLeft:="" Continue:=Vrai Wait:=Nouveau process("thermo_proc";32000;"$wait";"scan des dossiers") ListID:=0 Si (SourceLeft#"") 6 / 22

TABLEAU TEXTE(pathsLeft;0) TABLEAU ENTIER LONG(IDsLeft;0) SYN_Scan (SourceLeft;->H_Left;->pathsLeft;->IDsLeft) Si (SourceRight#"") TABLEAU TEXTE(pathsRight;0) TABLEAU ENTIER LONG(IDsRight;0) SYN_Scan (SourceRight;->H_Right;->pathsRight;->IDsRight) Text:="Comparaison..." APPELER PROCESS(-1) thpas:=100/ Cpt_Files ThFormat:="0;100;"+Chaine( thpas)+";0;5;0)" MESSAGE:="Upd" APPELER PROCESS( Wait) Si (SourceRight#"") & (SourceLeft#"") Au cas ou : (SS_Left=1) SYN_Compare (->H_Right;H_Left;->IDsRight;->IDsLeft;->pathsRight;->pathsLeft) : (SS_Right=1) SYN_Compare (->H_Left;H_Right;->IDsLeft;->IDsRight;->pathsLeft;->pathsRight) Fin de cas MESSAGE:="QuitScan" APPELER PROCESS( Wait) Méthode SYN_Scan C_TEXTE($1) `chemin d'accès C_POINTEUR($2) `liste C_POINTEUR($3) `tableau paths C_POINTEUR($4) `tableau Ids Thermo_Init ($1) $Path:=Sous chaine($1;1;longueur($1)-1) First:=Faux Si (Liste existante($2->)) SUPPRIMER LISTE($2->) TempListe:=Nouvelle liste TABLEAU TEXTE(Paths;0) TABLEAU ENTIER LONG(theIDs;0) LocalPath:=$1 DIR_GetFolder ($Path;TempListe;"";Vrai) DIR_GetDoc ($Path;TempListe) $2->:=Copier liste(templiste) CHANGER PROPRIETES LISTE($2->;A la Windows ;Réf icône Windows ;18) 7 / 22

TRIER LISTE($2->;>) REDESSINER LISTE($2->) COPIER TABLEAU(Paths;$3->) COPIER TABLEAU(theIDs;$4->) SUPPRIMER LISTE(TempListe) 8 / 22

Méthode DIR_GetFolder C_TEXTE($1) `path folder C_ENTIER LONG($2) `liste hierarchique C_TEXTE($3) C_BOOLEEN($4) `premier niveau faux, full catalogue vrai TABLEAU TABLEAU TABLEAU TEXTE($array;0) TEXTE($doc;0) TEXTE($dir;0) Si (Non(First)) LISTE DES DOSSIERS($1;$array) $full:=vrai First:=Faux TABLEAU TEXTE($array;1) $array{1}:=$3 $full:=$4 $size:=taille tableau($array) Boucle ($i;1;$size) `test si racine Si (DIR_F_IsVolume ($1)) $path:=$array{$i} Si ( Win) Si (First) $path:=$1+$array{$i} First:=Faux $path:=$1+ DirSep+$Array{$i} $path:=$1+ DirSep+$Array{$i} Si ( win) oklenght:=(longueur($path)<=255) Si (Non(okLenght)) ALERTE("Le chemin d'accès dépasse les 255 caractères permis!") oklenght:=vrai Si ( Continue) & (oklenght) $icon:=15000 $Sublist:=0 Si ($4) `full catalogue 9 / 22

LISTE DES DOCUMENTS($path;$doc) LISTE DES DOSSIERS($path;$dir) Si (Taille tableau($doc)>0) (Taille tableau($dir)>0) $Sublist:=Nouvelle liste DIR_GetFolder ($path;$sublist;$array{$i};$4) DIR_GetDoc ($path;$sublist) ListID:=ListID+1 AJOUTER A LISTE($2;$Array{$i};ListID;$SubList;Vrai) CHANGER PROPRIETES ELEMENT($2;0;Vrai; Gras ;$icon) $ttab:=taille tableau(paths)+1 INSERER LIGNES(Paths;$tTab;1) Paths{$tTab}:=Remplacer chaine($path;localpath;"") INSERER LIGNES(TheIDs;$tTab;1) TheIDs{$tTab}:=ListID $i:=$size `stop Fin de boucle Méthode DIR_GetDoc C_ALPHA(255;$1) `full path dossier C_ENTIER LONG($2) `liste TABLEAU ALPHA(255;$array;0) `scan du dossier passé en $1 LISTE DES DOCUMENTS($1;$Array) $asize:=taille tableau($array) Si ($asize>0) Boucle ($j;1;$asize) Si ( Continue) $path:=$1+ DirSep+$array{$j} Thermo_Update ($path) `méthode d'insertion dans liste hiérarchique H_Inserer ($2;$Path;$Array{$j};0;Vrai) $j:=$asize Fin de boucle Méthode SYN_Compare C_POINTEUR($1) `liste a synchroniser 10 / 22

C_ENTIER LONG($2) `liste source C_POINTEUR($3) `tableau IDs cible C_POINTEUR($4) `tableau lds source C_POINTEUR($5) `tableau local path cible C_POINTEUR($6) `tableau local path source C_ENTIER LONG($Style;$iconSource) C_TEXTE($tempPath;$SourcePath) $elemscible:=h_hierexpand ($1->;Vrai) $elemssource:=h_hierexpand ($2;Vrai) REDESSINER LISTE(H_Left) REDESSINER LISTE(H_Right) Boucle ($i;1;$elemssource) INFORMATION ELEMENT($2;$i;$refSource;$text;$SublistSource;$open) LIRE PROPRIETES ELEMENT($2;$refSource;$actif;$style;$iconSource) Thermo_Update ("Comparaison en cours :"+Caractere(13)+$text) `recherche du chemin source $pos:=chercher dans tableau($4->;$refsource) $SourcePath:=$6->{$pos} `recherche dans cible $p:=chercher dans tableau($5->;$sourcepath) Si ($p<1) `n'existe pas Si (Liste existante($sublistsource)) `dossier, nous recopions la sous liste $sublist:=h_hiercopy ($SublistSource;$3;$4;$5;$6) $icon:=15002 $sublist:=0 Si ($iconsource=15005) `fichier $icon:=15007 `dossier vide $icon:=15002 $short:=dir_f_shortname ($6->{$pos}) $parent:=dir_f_parentname ($6->{$pos}) $exist:=chercher dans tableau($5->;sous chaine($parent;1;longueur($parent)-1)) Si ($exist<0) AJOUTER A LISTE($1->;$short;$refSource;$sublist;Vrai) $pos:=position element liste($1->;($3->{$exist})) INFORMATION ELEMENT($1->;$pos;$Eref;$Etext;$ENumSublist;$Eopen) AJOUTER A LISTE($ENumSublist;$short;$refSource;$Sublist;Vrai) CHANGER PROPRIETES ELEMENT($1->;$refSource;Faux;$Style;$icon) $ttab:=taille tableau($3->)+1 11 / 22

INSERER LIGNES($3->;$ttab;1) $3->{$tTab}:=$refSource $p:=chercher dans tableau($4->;$refsource) INSERER LIGNES($5->;$ttab;1) $5->{$tTab}:=$6->{$p} `existe INFORMATION ELEMENT($1->;Position element liste($1->;$3- >{$p});$refcible;$text;$sublistcible;$open) LIRE PROPRIETES ELEMENT($1->;$refCible;$actif;$style;$iconCible) Si ($iconcible#15002) & ($iconcible#15007) Si (Liste existante($sublistcible)) `dossier $icon:=15003 Si ($iconsource=15005) `fichier $icon:=15008 `dossier vide $icon:=15003 CHANGER PROPRIETES ELEMENT($1->;$refCible;Faux;$Style;$icon) `vient d'etre ajouté Fin de boucle `vérification des dossiers / fichiers à supprimer `dans le dossier cible $elemscible:=nombre elements($1->) $i:=1 Tant que ($i<=$elemscible) INFORMATION ELEMENT($1->;$i;$refCible;$text;$SublistCible;$open) LIRE PROPRIETES ELEMENT($1->;$refCible;$actif;$style;$iconCible) `recherche du chemin cible $temppath:=$5->{chercher dans tableau($3->;$refcible)} `comparaison avec les sources $p:=chercher dans tableau($6->;$temppath) Si ($p<1) `n'existe pas dans les sources Si ($iconcible#15002) & ($iconcible#15007) Si (Liste existante($sublistcible)) `dossier à supprimer $icon:=15000+(1*killfolder) Si (($iconcible=15005) ($iconcible=15006) ($iconcible=15008)) 12 / 22

`fichier à supprimer $icon:=15005+(1*killfolder) `dossier vide à supprimer $icon:=15000+(1*killfolder) CHANGER PROPRIETES ELEMENT($1->;$refCible;Faux;Standard ;$icon) $i:=$i+1 `vient d'etre ajouté SYN_Kill ($1->;$3;$5;$i) $elemscible:=nombre elements($1->) $i:=$i+1 Fin tant que TRIER LISTE($1->;>) REDESSINER LISTE($1->) Méthode SYN_Kill C_ENTIER LONG($SubList;$Style;$Icon) C_ENTIER LONG($1) `liste source C_POINTEUR($2) `IDs source C_POINTEUR($3) `paths Source C_ENTIER LONG($4) `position INFORMATION ELEMENT($1;$4;$ref;$text;$Sublist;$open) Si (Liste existante($sublist)) $elems:=h_hierexpand ($SubList;Vrai) Tant que ($elems>0) `récursivité SYN_Kill ($Sublist;$2;$3;$elems) REDESSINER LISTE($SubList) $elems:=nombre elements($sublist) Fin tant que CHANGER ELEMENT($1;$Ref;$text;$Ref;0;Vrai) SUPPRIMER LISTE($SubList;*) `suppression dans tableaux $target:=chercher dans tableau($2->;$ref) SUPPRIMER LIGNES($2->;$target;1) SUPPRIMER LIGNES($3->;$target;1) `suppression dans la liste $aref:=element parent($1;$ref) SUPPRIMER ELEMENT($1;$ref) 13 / 22

Si ($aref>0) $pos:=position element liste($1;$aref) INFORMATION ELEMENT($1;$pos;$aref;$atext;$Sublist;$open) Si ($Sublist#0) REDESSINER LISTE($SubList) $elems:=nombre elements($sublist) Si ($elems<1) CHANGER ELEMENT($1;$aRef;$atext;$aRef;0;Vrai) SUPPRIMER LISTE($SubList;*) Méthode du bouton Supprimer Gauche CommentLeft:="" SYN_Kill (H_Left;->IDsLeft;->pathsLeft;Element selectionne(h_left)) SYN_Compare (->H_Right;H_Left;->IDsRight;->IDsLeft;->pathsRight;->pathsLeft) Méthode du bouton Synchroniser OK:=0 Si (KillFolder=1) $text:="attention : vous allez supprimer les dossiers et fichiers de " Si (SS_Left=1) $text:=$text+nameright+" ne se trouvant pas dans "+NameLeft $text:=$text+nameleft+" ne se trouvant pas dans "+NameRight CONFIRMER($text;"Synchroniser";"Annuler") OK:=1 Si (OK=1) ScanOk:=Faux Wait:=Nouveau process("thermo_proc";32000;"$wait";"synchronisation en cours") Si (SS_Left=1) DIR_Synchronise (->H_Right;->IDsRight;->PathsRight;SourceRight;SourceLeft) TABLEAU TEXTE(pathsRight;0) TABLEAU ENTIER LONG(IDsRight;0) `scan du dossier cible SYN_Scan (SourceRight;->H_Right;->pathsRight;->IDsRight) `comparaison avec les sources SYN_Compare (->H_Right;H_Left;->IDsRight;->IDsLeft;->pathsRight;->pathsLeft) DIR_Synchronise (->H_Left;->IDsLeft;->PathsLeft;SourceLeft;SourceRight) 14 / 22

TABLEAU TEXTE(pathsLeft;0) TABLEAU ENTIER LONG(IDsLeft;0) `scan du dossier cible SYN_Scan (SourceLeft;->H_Left;->pathsLeft;->IDsLeft) `comparaison avec les sources SYN_Compare (->H_Left;H_Right;->IDsLeft;->IDsRight;->pathsLeft;->pathsRight) CHOIX VISIBLE(*;"pop@";Vrai) MESSAGE:="QuitScan" APPELER PROCESS( Wait) Méthode DIR_Synchronise C_POINTEUR($1) ` liste cible C_POINTEUR($2) `tableau IDs C_POINTEUR($3) `tableau Chemins relatifs C_TEXTE($4) `chemin local cible C_TEXTE($5) `chemin local Source C_ENTIER LONG($sublist;$Style;$icon) nbsync:=h_hierexpand (H_Right;Vrai) Repeter ENDORMIR PROCESS(Numero du process courant;5) Jusque ( ScanOk) Text:="Synchronisation" APPELER PROCESS(-1) thpas:=100/ nbsync ThFormat:="0;100;"+Chaine( thpas)+";0;5;0)" MESSAGE:="Upd" APPELER PROCESS( Wait) Cpt:=1 Tant que ( Cpt<= nbsync) INFORMATION ELEMENT($1->; Cpt;$ref;$text;$Sublist;$open) LIRE PROPRIETES ELEMENT($1->;$Ref;$Saisissable;$Style;$Icon) $target:=chercher dans tableau($2->;$ref) $TargetPath:=$4+$3->{$target} $SourcePath:=$5+$3->{$target} Au cas ou : ($Icon=15007) ` fichierà ajouter Thermo_Update ("Copie de :"+$TargetPath) COPIER DOCUMENT($SourcePath;$TargetPath;*) Cpt:= Cpt+1 15 / 22

: ($Icon=15006) `fichier a supprimer Thermo_Update ("Suppression de :"+$TargetPath) CHANGER PROPRIETES DOCUMENT($TargetPath;Faux; Faux; Date du jour; Heure courante; Date du jour; Heure courante) SUPPRIMER DOCUMENT($TargetPath) Cpt:= Cpt+1 : ($Icon=15008) ` fichier à remplacer Thermo_Update ("Copie de :"+$TargetPath) CHANGER PROPRIETES DOCUMENT($TargetPath;Faux; Faux; Date du jour; Heure courante; Date du jour; Heure courante) COPIER DOCUMENT($SourcePath;$TargetPath;*) Cpt:= Cpt+1 : ($Icon=15001) `dossier a supprimer Cpt:= Cpt+DIR_DelFolder ($TargetPath) : ($Icon=15002) `dossier a ajouter $ok:=dir_f_folderexist ($TargetPath) Cpt:= Cpt+1 : ($Icon=15003) ` dossier à remplacer $ok:=dir_f_folderexist ($TargetPath) Cpt:= Cpt+1 `on ne fait rien Cpt:= Cpt+1 Fin de cas Fin tant que Les méthodes génériques Méthode H_HierExpand Méthode utilisée pour déployer contracter une liste ou une sous-liste suivant le deuxième paramètre. C_ENTIER LONG($0;$elem;$1;$i;$ref) C_BOOLEEN($2) Si (Liste existante($1)) $elem:=nombre elements($1) $i:=1 Tant que ($i<=$elem) $sublist:=0 16 / 22

INFORMATION ELEMENT($1;$i;$ref;$text;$sublist;$expand) Si (($sublist#0) & $2) `récursivité $temp:=h_hierexpand ($Sublist;$2) $i:=$i+$temp $elem:=$elem+$temp $i:=$i+1 CHANGER ELEMENT($1;$ref;$text;$ref;$sublist;$2) Fin tant que $0:=Nombre elements($1) $0:=0 Méthode H_HierCopy C_ENTIER LONG($elem;$i;$ref;$SubList;$Style) C_ENTIER LONG($1;$0) `liste à copier et liste renvoyée C_POINTEUR($2) `tableau IDs cible C_POINTEUR($3) `tableau lds source C_POINTEUR($4) `tableau local path à synchroniser C_POINTEUR($5) `tableau local path originaux $0:=0 Si (Liste existante($1)) $NewListe:=Copier liste($1) $templiste:=copier liste($1) $elem:=h_hierexpand ($templiste;vrai) $i:=1 Tant que ($i<=$elem) INFORMATION ELEMENT($tempListe;$i;$ref;$text;$sublist;$expand) LIRE PROPRIETES ELEMENT($tempListe;$ref;$actif;$style;$Oicon) Si ($sublist>0) $sublist:=h_hiercopy ($Sublist;$2;$3;$4;$5) $icon:=15002 Si ($Oicon=15005) $icon:=15007 `dossier vide $icon:=15002 $ttab:=taille tableau($2->)+1 CHANGER ELEMENT($NewListe;$ref;$text;$ref;$sublist;Vrai) CHANGER PROPRIETES ELEMENT($NewListe;$ref;Faux;$style;$icon) $i:=$i+1 INSERER LIGNES($2->;$ttab;1) $2->{$tTab}:=$ref $p:=chercher dans tableau($3->;$ref) INSERER LIGNES($4->;$ttab;1) $4->{$tTab}:=$5->{$p} 17 / 22

Fin tant que $0:=$NewListe SUPPRIMER LISTE($tempListe) Méthode H_Inserer C_ENTIER LONG($1;$4) `liste et sublist C_ALPHA(255;$2) `path C_ALPHA(31;$3) `libellé C_BOOLEEN($5) `insertion dans tableau paths ListID:=ListID+1 AJOUTER A LISTE($1;$3;ListID;$4;Faux) CHANGER PROPRIETES ELEMENT($1;0;Faux;Standard ;15005) Si (Nombre de parametres=5) $ttab:=taille tableau(paths)+1 INSERER LIGNES(Paths;$tTab;1) Paths{$tTab}:=Remplacer chaine($2;localpath;"") INSERER LIGNES(TheIDs;$tTab;1) TheIDs{$tTab}:=ListID Méthode DIR_DelFolder C_TEXTE($1) C_ENTIER LONG($0;$Elems) $Elems:=0 Si (Tester chemin acces($1)=est un répertoire ) `utilisation de suppression document sur folder -> fonctionne LISTE DES DOSSIERS($1;$folders) LISTE DES DOCUMENTS($1;$docs) Si ((Taille tableau($folders)+taille tableau($docs))>0) Boucle ($i;1;taille tableau($folders)) $folder:=$1+ DirSep+$folders{$i} `récursivité $Elems:=$Elems+DIR_DelFolder ($folder) Fin de boucle Boucle ($i;1;taille tableau($docs)) $doc:=$1+ dirsep+$docs{$i} Thermo_Update ("Suppression de :"+$doc) CHANGER PROPRIETES DOCUMENT($doc;Faux; Faux; Date du jour; Heure courante; Date du jour; Heure courante) SUPPRIMER DOCUMENT($Doc) $Elems:=$Elems+1 Fin de boucle Si (Non(DIR_F_IsVolume ($1))) Thermo_Update ("Suppression de :"+$1) 18 / 22

CHANGER PROPRIETES DOCUMENT($1;Faux; Faux; Date du jour; Heure courante; Date du jour; Heure courante) SUPPRIMER DOCUMENT($1) $Elems:=$Elems+1 $0:=$Elems Méthode DIR_FolderExist `vérifie l'existence du dossier, sinon le crée C_BOOLEEN($0) C_TEXTE($1) $err:=tester chemin acces($1) Si ($err<0) CREER DOSSIER($1) $0:=(Tester chemin acces($1)=0) Méthode DIR_F_IsVolume ` volumes initialisé par liste des volumes C_BOOLEEN($0) C_TEXTE($1) $0:=(Chercher dans tableau( volumes;$1)>0) Méthode DIR_F_ParentName `renvoi le chemin d'accès du dossier parent C_TEXTE($1) C_ALPHA(255;$0) C_ENTIER($i) $0:="" Boucle ($i;longueur($1);1;-1) Si ($1 $i = DirSep) $0:=Sous chaine($1;1;$i) $i:=1 Fin de boucle Méthode DIR_F_ShortName `fonction F_ShortNAme 19 / 22

C_TEXTE($1;$temp) C_ALPHA(255;$0) C_ENTIER($p) $p:=0 $temp:=$1 Repeter $p:=position( DirSep;$temp) $temp:=sous chaine($temp;$p+1) Jusque ($p=0) $0:=$temp Note Générale Il vous est apparu que la gestion des erreurs n'était pas implémentée. Pour que cette note devienne un applicatif, il faudrait lui rajouter cette notion (fichiers ouverts à l'écriture, fichiers verrouillés, etc.) et coder toute la synchronisation en pseudo transaction. C est-à-dire synchroniser dans un dossier temporaire, et si nous ne rencontrons pas d'erreurs, réaliser la vrai synchronisation. Annexe Deux routines utilisées pour le "boot" MacOS : Clignotement d'un curseur : $L:=Longueur( Win_Zone) Boucle ($i;1;5) Win_zone:= Win_zone+"_" APPELER PROCESS(-1) ENDORMIR PROCESS(Numero du process courant;5) Win_Zone:=Sous chaine( Win_Zone;1;$L) APPELER PROCESS(-1) ENDORMIR PROCESS(Numero du process courant;5) Fin de boucle Simulation de saisie de caractères : C_TEXTE($1) Zone_Curs $L:=Longueur($1) Boucle ($i;1;$l) Win_Zone:= Win_Zone+$1 $i APPELER PROCESS(-1) ENDORMIR PROCESS(Numero du process courant;1) 20 / 22

Fin de boucle Zone_Update (( KRC*2);2) C_TEXTE($1) C_ENTIER LONG($2) Si (( Lignes+$2)> Hauteur) Boucle ($i;1;$2) $p:=position( KRC; Win_Zone) Win_Zone:=Sous chaine( Win_Zone;$p+1) APPELER PROCESS(-1) ENDORMIR PROCESS(Numero du process courant;2) Fin de boucle Win_Zone:= Win_Zone+$1 APPELER PROCESS(-1) Lignes:= Lignes+$2 Méthode DIR_MoveFolder Non utilisée dans cette note. Vous permet de copier un répertoire ou de déplacer un répertoire. `$1 source folder `$2 target folder `$3 Supprimer le dossier source? C_TEXTE($1;$2) C_ENTIER LONG($0) C_BOOLEEN($3) $Elems:=1 Si (Tester chemin acces($1)>-1) $elems:=$elems+dir_movedoc ($1;$2;Faux) LISTE DES DOSSIERS($1;$folder) Si (DIR_F_FolderExist ($2)) Boucle ($j;1;taille tableau($folder)) $path:=$1+ DirSep+$folder{$j} $target:=$2+ DirSep+$folder{$j} $Elems:=$Elems+DIR_MoveFolder ($path;$target;$3) Fin de boucle Si ($3) `suppression de la source DIR_DelFolder ($1) `catalogue non valide $0:=$Elems Méthode DIR_MoveDoc Non utilisée dans cette note. Vous permet de copier un fichier ou de déplacer un fichier. 21 / 22

C_TEXTE($1;$2) `source et target paths C_BOOLEEN($3) `supprimer le document source? C_ENTIER LONG($0) LISTE DES DOCUMENTS($1;$array) Si (DIR_F_FolderExist ($2)) $0:=Taille tableau($array) Si ($0>0) Boucle ($j;1;$0) $path:=$1+ DirSep+$array{$j} $target:=$2+ DirSep+$array{$j} Thermo_Update ("Copie de :"+$target) Si ($3) DEPLACER DOCUMENT($path;$target) COPIER DOCUMENT($path;$target;*) Fin de boucle 22 / 22