Complements sur les diverses pistes proposées :
Gestion des inventaires
Pour faire simple : 2 TStringList, un pour les fichiers locaux, un pour les fichiers distants.
Les listes seront remplie par les noms de fichier contenant les chemins relatifs par rapport au repertoire "root" designé.
Comparer 2 fichier revient a parcourir tous les elements d'une liste et de rechercher la presence de cette meme chaine dans la 2e (IndexOf)
Si elle existe => Comparaison des fichier
Sinon => Suppression ou ajout du fichier selon qu'il manque sur le repertoire distant ou local.
Pour eviter de se melanger les pinceau, on parcours la liste locale, et on supprime de la liste distante toutes les entrees traitees.
Cette boucle traite dont tous les fichiers locaux differents de la liste distante ou non present.
Pour traiter les fichier present sur la liste distante et non dans la liste locale, on effectue une 2e boucle apres la precedente sur la liste distante qui ne contient (apres suppression des entrees traitee) seulement les entree non traitees donc non presente dans la liste locale.
On met traite donc ce fichiers comme il le faut.
[Note] Pour traiter plusieurs repertoires separes, il faut repeter cette operation pour chacun d'entre eux.
Creation des listes
Pour creer les listes, une fonction recursive du type :
Procedure Scan(rootDir, SubDir : String);
est utile.
RootDir est le repertoire racine, SubDir le sous repertoire depuis la racine.
Dans le corps de cette fonction on fait des FinFirst, FindNext et un find close avant de sortir de la procedure.
FindFirst s'applique sur RootDir+SubDir.
Tant que l'on trouve des fichiers, on effectue pour chacun d'eux un test : Si l'attribut est "faDirectory" alors on lance un appel reccursif sur cette fonction avec comme parametres : RootDir et SubDir+<NomFichier Repertoire.
De cette facon on construit etapes apres etapes les chemins relatinfs depuis la racine.
Attention a tester en plus de l'attribut, le nom du repertoire, car sous DOS (et don Windows) il existe 2 reperoire qui sont retourné en debut de recherche : "." et "..".
Lancer une recursivite sur le repertoire "." qui est un pointeur sur le repertoire courrant genere un debordement de pile : On scan le repertoire de base qui retourne . on rentre dans ce reperoire (car attribut "repertoire") et on scanne ce repertoire. le Repertoire "." etant celui dans lequel on est, on bouble indefiniement sur le meme reperoire.
'..' lui pointe sur le repertoire supperieur, donc si on l'oublie, on remonte de reperotires en repertoire jusqu'a obtenir une violation d'acces car il n'y existe aucun repertoire supperieur a la lettre de lecteur.
Au final, il faut donc tester si l'attribut est egal a faDirectory, puis si le nom du fichier (repertoire) est different ed "." et ".." et dans ce cas lancer la recursivité.
Sinon, si le fichier n'est pas un repertoire, alors ajouter la concatenation subdir+Filename dans la liste adequate.
[Note] Pour tester l'attribu :
If (SearchRec.attr and faDirectory) = faDirectory Then
Car depuis XP il me semble, les repertoires sont accompagné d'autres flags que celui de faDirectory, ce qui implique que le test de attr=faDirectory echoue meme pour les reperoire. Il faut donc verifier si le flag repertoire est dans la liste des attributs.
Test si 2 fichiers ont ete modifiées
LA date est effectivement un bon moyen de tester si un fichier est modifier ou non. Mais il en existe d'autres :
- Utilisation du flag "archive"
- Calcul d'un checksum quelconque : CRC32, MD5. Cette methode est ideale pour s'assurer que 2 fichiers sont bien differents, mais a un cout temporel de calcul a prendre en compte.
Bonne prog !!
Partager