1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| void parcourirRep(char *chemRep, char *chemRelatif,chaineFichier *fichiersPresent){
struct dirent *entree;
struct stat statEntree;
char *cheminComplet=NULL;
char *chemRelatifBak=NULL;
char *chemEtFichier=NULL;
DIR *rep;
//si le chemin relatif est différent de NULL, c'est à dire si on est rentré dans un dossier à partir du dossier d'origine.
if (chemRelatif!=NULL){
//on concatène le chemin de base au chemin du repertoire fils pour avoir le chemin complet.
cheminComplet=malloc((strlen(chemRep)+strlen(chemRelatif)+1)*sizeof(char));
strcpy(cheminComplet,chemRep);
//strcat(cheminComplet,"/");
strcat(cheminComplet,chemRelatif);
}
//si on est dans le repertoire racine.
else{
//le chemin complet est le chemin racine de base.
cheminComplet=malloc((strlen(chemRep)+1)*sizeof(char));
strcpy(cheminComplet,chemRep);
//strcat(cheminComplet,"/");
}
printf("chemin : %s\n",cheminComplet);
//on ouvre ce repertoire.
rep = opendir(cheminComplet);
//si le repertoire n'a pu etre ouvert => message d'erreur
if (rep==NULL){
fprintf(stderr,"%s : Problème lors de l'ouverture !\n", chemRep);
}
//si on arrive a ouvrir le repertoire.
else{
//on boucle sur toutes les entrees du repertoire
while ((entree = readdir(rep))){
//si l'entree est un repertoire autre que '.' et '..'
if (entree->d_type==4 && strcmp(entree->d_name,".")!=0 && strcmp(entree->d_name,"..")!=0){
//si le chemin relatif n'est pas null
if (chemRelatif!=NULL){
//on alloue une place mémoire pour sauvegarder l'ancien chemin relatif et on le copie dedans
chemRelatifBak=malloc((strlen(chemRelatif)+1)*sizeof(char));
strcpy(chemRelatifBak,chemRelatif);
//on réallou la taille mémoire pour le cheminRElatif
chemRelatif=realloc(chemRelatif,(strlen(chemRelatif)+strlen(entree->d_name)+1)*sizeof(char));
strcat(chemRelatif,entree->d_name);
strcat(chemRelatif,"/");
}
else{
//le chemin est null donc
//on allou une place mémoire pour le chemin relatif car c'est la premiere fois qu'il est crée
chemRelatif=malloc((strlen(entree->d_name)+1)*sizeof(char));
strcpy(chemRelatif,entree->d_name);
strcat(chemRelatif,"/");
}
//on relance récursivement la fonction pour aller chercher dans ce repertoire.
parcourirRep(chemRep,chemRelatif,&(*fichiersPresent));
//on récupère l'ancien cheminRelatif
chemRelatif=chemRelatifBak;
}
//si l'entree est autre que repertoire.
if (entree->d_type!=4 && strcmp(entree->d_name,".")!=0 && strcmp(entree->d_name,"..")!=0){
//on allou une place mémoire pour la concaténation du chemin relatif avec le nom du fichier.
//Si le chemin n'est pas null on concatène le chemin relatif et le nom du fichier
//on lance la fonction qui va copier dans le fichier de sync, la file de fichiers.
if (chemRelatif!=NULL){
chemEtFichier=malloc((strlen(entree->d_name)+strlen(chemRelatif)+1)*sizeof(char));
strcpy(chemEtFichier,chemRelatif);
strcat(chemEtFichier,entree->d_name);
}
else{
//sinon le chemin est le nom du ficheir
chemEtFichier=malloc((strlen(entree->d_name)+1)*sizeof(char));
strcpy(chemEtFichier,entree->d_name);
}
//printf("%s",chemEtFichier);
//chemin abslue pour faire le stat!
cheminComplet=malloc((strlen(chemRep)+strlen(chemEtFichier)+1)*sizeof(char));
strcpy(cheminComplet,chemRep);
strcat(cheminComplet,chemEtFichier);
//on récupère les stats du fichier!
stat(cheminComplet,&statEntree);
//on enfile dans la file le chemin relatif,le nom du fichier et la date de modif
//printf("%u\n",*((unsigned int *)&statEntree.st_mtime));
enfiler(chemEtFichier,(unsigned int *)&statEntree.st_mtime,&(*fichiersPresent));
}
}
}
//printf("::");
//on ferme le repertoire
closedir(rep);
//on free la sauvegarde du chemin relatif
//free(chemRelatifBak);
//je sais pas comment free(cheminComplet) à voir !!
} |
Partager