Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
951 connectés 

  FORUM HardWare.fr
  Programmation
  C

  comment indexer tous les fichiers d'un repertoire en c

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

comment indexer tous les fichiers d'un repertoire en c

n°2144392
theFirst2
Posté le 03-06-2012 à 19:48:02  profilanswer
 

Bonjour
Dans le cadre d'un projet j'essaye de mettre en place un moteur d'indexation des fichiers d'un repertoire en langage C.Mon souci est que j'arrive a ouvrir mon repertoire et à lister les fichiers mais j'arrive pas a acceder au contenu des fichiers .  
le code que j'utilise est le suivant il compile mais j'ai un index vide  aidez moi svp :

Code :
  1. s_index make_index(int index_size, char *ad){
  2. int i;
  3. int nbl = 1;
  4. mot t_mot;
  5. s_index index;
  6. char temp[40], *tpm, c_tpm, c;
  7. FILE *fic;
  8. DIR * rep = opendir(ad);
  9. index_taille = 0;
  10.  char fn[256];
  11. //allocation de l'index
  12. index = create_index(index_size);
  13. if (rep != NULL){
  14.  struct dirent * ent;
  15.  while ((ent = readdir(rep)) != NULL){
  16.  //puts("ERREUR : le dossier existe" );
  17.  printf("%s\n", ent->d_name);
  18.   if(strcmp(ent->d_name,"." )==0|| strcmp(ent->d_name,".." )==0){
  19.    continue;
  20.   }
  21.   snprintf(fn,sizeof fn,ad,ent->d_name);
  22.   else if ((fic = fopen(fn, "r" )) == NULL){
  23.     puts("ERREUR : le fichier n'existe pas" );
  24.     return NULL;
  25.    }
  26.   else{
  27.    while ((c = fgetc(fic))!=EOF){
  28.     i = 0;
  29.     printf("okkkk\n" );
  30.     while (!is_sep(c)){
  31.      // suppression des accents et transformation en minuscule
  32.      c_tpm = tolower(c);
  33.      temp[i] = c_tpm;
  34.      c = fgetc(fic);
  35.      i++;printf("okkkk\n" );
  36.     }
  37.     temp[i] = '\0';
  38.     if (temp[0] != '\0'){
  39.      tpm = (char *)malloc(strlen(temp));
  40.      strcpy(tpm,temp);
  41.     }
  42.     else tpm = NULL;
  43.     if (tpm != NULL){
  44.      t_mot = create_mot(tpm, nbl);
  45.      if(index->tab_size == 26)
  46.       insere_mot(&index->tab[tpm[0]-'a'], t_mot, &index);
  47.      else
  48.       insere_mot(&index->tab[0], t_mot, &index);
  49.     }
  50.     if (c == '\n')
  51.      nbl++;
  52.    }
  53.   }
  54.  }
  55. puts("les fichiers ont bien ete indexe" );
  56. }
  57. return index;
  58. }


Message édité par gilou le 03-06-2012 à 21:34:02
mood
Publicité
Posté le 03-06-2012 à 19:48:02  profilanswer
 

n°2144456
Trap D
Posté le 04-06-2012 à 11:31:31  profilanswer
 

Cela ne devrait même pas compiler, il doit y avoir une erreur de copier coller :

Code :
  1. while ((ent = readdir(rep)) != NULL)
  2.   {
  3.    //puts("ERREUR : le dossier existe" );
  4.    printf("%s\n", ent->d_name);
  5.    if(strcmp(ent->d_name,"." )==0|| strcmp(ent->d_name,".." )==0)
  6.    {
  7.     continue;
  8.    }
  9.    snprintf(fn,sizeof fn,ad,ent->d_name);  <== ici
  10.    else                                                <== ici
  11.    if ((fic = fopen(fn, "r" )) == NULL)
  12.    {
  13.     puts("ERREUR : le fichier n'existe pas" );
  14.     return NULL;
  15.    }

Les fichiers sont ouverts et jamais fermés et comme on n'a pas le code de insere_mot ...

n°2144471
gilou
Modérateur
Modzilla
Posté le 04-06-2012 à 11:56:54  profilanswer
 

De toute façon, une fonction "indexer répertoire" devrait faire appel à une fonction "indexer fichier" (qui aurait permis d'encadrer proprement l'appel avec un open et un close du fichier). Inutile de continuer tant que c'est architecturé avec les pieds.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2144509
theFirst2
Posté le 04-06-2012 à 14:20:02  profilanswer
 

En effet il y'avait une de copier coller . J'ai bien essayé de mettre en place une fonction indexer fichier mais comme j'essaye de creer un seul index pour tout les fichiers du repertoire je me pose des questions au niveau du chainage.Mais voici quand meme le code de la fonction insere_mot et de la fonction creer_index car je suis pas tres a l'aise avec les fichiers et les pointeurs ...
 

Code :
  1. void insere_mot (mot *o_mt, mot t_mt, s_index *index)
  2. {
  3. mot temp, ptr;
  4. ptr = *o_mt;
  5. while( ptr->suiv != NULL && strcmp(t_mt->mt,ptr->suiv->mt) >0)
  6.  ptr = ptr->suiv;
  7. if (ptr->suiv != NULL && strcmp(t_mt->mt, ptr->suiv->mt) == 0)
  8. {
  9.  ptr->suiv->occ++;
  10.  insere_ligne(&ptr->suiv->l_lg, t_mt->l_lg->suiv);
  11.  free(t_mt);
  12. }
  13. else
  14. {
  15.  index_taille += (strlen(t_mt->mt) + 1 + 2);
  16.  (*index)->count_mot++;
  17.  temp = ptr->suiv;
  18.  ptr->suiv = t_mt;
  19.  t_mt->suiv = temp;
  20. }
  21. }
  22. // insertion d'une ligne dans une struture mot
  23. void insere_ligne (ligne *o_l, ligne t_l)
  24. {
  25. ligne temp, ptr;
  26. ptr = *o_l;
  27. while (ptr->suiv != NULL)
  28.  ptr = ptr->suiv;
  29. if (ptr->lg != t_l->lg)
  30. {
  31.  index_taille += 2;
  32.  temp = ptr->suiv;
  33.  ptr->suiv = t_l;
  34.  t_l->suiv = temp;
  35. }
  36. else free(t_l);
  37. }
  38. s_index make_index(int index_size, char *ad){
  39. int i;
  40. int nbl = 1;
  41. mot t_mot;
  42. s_index index;
  43. char temp[40], *tpm, c_tpm, c;
  44. FILE *fic;
  45. DIR * rep = opendir(ad);
  46. index_taille = 0;
  47. char fn[256];
  48. //allocation de l'index
  49. index = create_index(index_size);
  50. if (rep != NULL){
  51. struct dirent * ent;
  52. while ((ent = readdir(rep)) != NULL){
  53. //puts("ERREUR : le dossier existe" );
  54. printf("%s\n", ent->d_name);
  55.  if(strcmp(ent->d_name,"." )==0|| strcmp(ent->d_name,".." )==0){
  56.    continue;
  57.  }
  58.  snprintf(fn,sizeof fn,ad,ent->d_name);
  59.  if ((fic = fopen(fn, "r" )) == NULL){
  60.     puts("ERREUR : le fichier n'existe pas" );
  61.     return NULL;
  62.    }
  63.  else{
  64.    while ((c = fgetc(fic))!=EOF){
  65.     i = 0;
  66.     printf("okkkk\n" );
  67.     while (!is_sep(c)){
  68.      // suppression des accents et transformation en minuscule
  69.      c_tpm = tolower(c);
  70.      temp[i] = c_tpm;
  71.      c = fgetc(fic);
  72.      i++;printf("okkkk\n" );
  73.     }
  74.     temp[i] = '\0';
  75.     if (temp[0] != '\0'){
  76.      tpm = (char *)malloc(strlen(temp));
  77.      strcpy(tpm,temp);
  78.     }
  79.     else tpm = NULL;
  80.     if (tpm != NULL){
  81.      t_mot = create_mot(tpm, nbl);
  82.      if(index->tab_size == 26)
  83.       insere_mot(&index->tab[tpm[0]-'a'], t_mot, &index);
  84.      else
  85.       insere_mot(&index->tab[0], t_mot, &index);
  86.     }
  87.     if (c == '\n')
  88.      nbl++;
  89.    }
  90.  }
  91. }
  92. puts("les fichiers ont bien ete indexe" );
  93. }
  94. return index;
  95. }

n°2144521
gilou
Modérateur
Modzilla
Posté le 04-06-2012 à 16:48:03  profilanswer
 

C'est pourtant pas dur:
tu crées ta structure d'index
1) tu ouvres le répertoire
2) tu boucles sur les fichiers du répertoire
    3) si c'est un fichier (et non pas un répertoire, ce qui va permettre d'exclure . et .. mais aussi les sous répertoires éventuels)
    4) tu ouvres le fichier
    5) tu indexes le fichier
    6) tu fermes le fichier
7) tu fermes le répertoire
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2144576
theFirst2
Posté le 05-06-2012 à 01:44:05  profilanswer
 

gilou a écrit :

C'est pourtant pas dur:
tu crées ta structure d'index
1) tu ouvres le répertoire
2) tu boucles sur les fichiers du répertoire
    3) si c'est un fichier (et non pas un répertoire, ce qui va permettre d'exclure . et .. mais aussi les sous répertoires éventuels)
    4) tu ouvres le fichier
    5) tu indexes le fichier
    6) tu fermes le fichier
7) tu fermes le répertoire
 
A+,


 J'ai essayé de faire comme tu la dit mais j'ai toujours des soucis au niveau de la lecture du fichier car j'ai toujours un index vide (ce qui n'est pas normal lol).Mon programme n'entre meme pas dans la boucle qui doit parcourir le fichier et recuperer les données dans le fichier .selon moi c'est cette partie du code qui marche pas  

Code :
  1. //allocation de l'index
  2. index = create_index(index_size);
  3. if (rep != NULL){
  4.  struct dirent * ent;
  5.  while ((ent = readdir(rep)) != NULL){
  6.  //puts("ERREUR : le dossier existe" );
  7.  printf("%s\n", ent->d_name);
  8.   if(strcmp(ent->d_name,"." )==0|| strcmp(ent->d_name,".." )==0){
  9.    continue;
  10.   }
  11.   snprintf(fn,sizeof fn,ad,ent->d_name);
  12.   if (fic = fopen(fn, "r" )){          //a partir d'ici je recupere rien dans le fichier
  13.    while ((c = fgetc(fic))!=EOF){  //je rentre jamais dans cette boucle je sais pas pourquoi
  14.     i = 0;
  15.     while (!is_sep(c)){
  16.      // suppression des accents et transformation en minuscule
  17.      c_tpm = tolower(c);
  18.      temp[i] = c_tpm;
  19.      c = fgetc(fic);
  20.      i++;//printf("okkkk\n" );  
  21.     }
  22.     temp[i] = '\0';
  23.     if (temp[0] != '\0'){
  24.      tpm = (char *)malloc(strlen(temp));
  25.      strcpy(tpm,temp);
  26.     }
  27.     else tpm = NULL;
  28.     if (tpm != NULL){
  29.      t_mot = create_mot(tpm, nbl);
  30.      if(index->tab_size == 26)
  31.       insere_mot(&index->tab[tpm[0]-'a'], t_mot, &index);
  32.      else
  33.       insere_mot(&index->tab[0], t_mot, &index);
  34.     }
  35.     if (c == '\n')
  36.      nbl++;
  37.    }
  38.   }close(fic);
  39.  }
  40. closedir(rep);
  41. puts("les fichiers ont bien ete indexe" );
  42. }
  43. return index;


 

n°2144612
gilou
Modérateur
Modzilla
Posté le 05-06-2012 à 12:34:25  profilanswer
 

Tant que tu passeras pas ton temps à rendre ça modulaire (c'est a dire en fonctions au rôle clairement défini aux fonctionalités testables sans avoir a faire fonctionner du code supplémentaire), je vais pas trop chercher à comprendre un code dont on n'a pas tous les morceaux.
Parce que ici, il est clair qu'on devrait avoir une logique dans le style:
 
while ( line = get_next_line(fichier)) {
    ++line;
    while (mot = get_next_mot(line)) {
        insère_mot(normalise_mot(mot), &index);
    }
}
 
et que tout faire en monobloc rend ça opaque et pas facilement testable.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2144633
gilou
Modérateur
Modzilla
Posté le 05-06-2012 à 14:44:42  profilanswer
 

Bon, pour ceux que ça intéresse, les deux erreurs a corriger:
close(fic); ça doit être fclose(fic); et le couper-coller l'a mis après l'accolade, ça devrait être avant.
snprintf(fn,sizeof fn,ad,ent->d_name); n'a pas l'indication de format, ça doit être snprintf(fn,sizeof fn,"%s\\%s", ad,ent->d_name); sous Windows (et snprintf(fn,sizeof fn,"%s/%s", ad,ent->d_name); sous linux) sinon aucun fichier n'est ouvert d'ou l'index vide.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2144692
theFirst2
Posté le 05-06-2012 à 23:32:03  profilanswer
 

merci d'avoir pris le temps de m'aidez !!!!!Sa me vas droit au coeur

n°2144693
theFirst2
Posté le 05-06-2012 à 23:36:23  profilanswer
 

Il me reste deux trois trucs a reglé et c'est ok!!!!!thanks u i appreciated that


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  comment indexer tous les fichiers d'un repertoire en c

 

Sujets relatifs
synchroniser deux fichiers excel avec macrofind > exclure motifs fichiers & repertoires
Fusionner plusieurs fichiers CVS un seul fichier excelles fichiers
C++ Builder répertoire problème !!help! sccript batch qui permet de comparer et supprimer des fichiers
ajouter le date du jour sur le nom des fichiers sélectionnés [résolu]Affichage de fichiers supérieur à...en DOS
Fichiers & structures & String - Fonction de recherche 
Plus de sujets relatifs à : comment indexer tous les fichiers d'un repertoire en c


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR