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