Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lister le répertoire courant en ordre

    10 octobre 2021 à 12:08:07

    Un programme en C qui prend un modèle comme argument de ligne de commande et récursivement recherche dans les répertoires pour trouver un nom de fichier correspondant à ce modèle. Il devrait imprimer un chemin relatif commençant par "./" pour chaque fichier/répertoire qui correspond au modèle entré. Mais je bloque au niveau du "if((dp[i]->d_type = readdir(dir)))". J'ai de la peine a ressoudre cette erreur. Merci de me donne quelques indices.
    #include <dirent.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <sys/dir.h>
    #include <stdlib.h>
    
    int listFilesRecursively(char *path, char *pattern, int found);
    
    int main(int argc, char *argv[])
    {
        char path[100];
        char *pattern;
        int found = 0;
        
        if( argc == 2 ) 
        {
          printf("L'argument est %s\n", argv[1]);
          pattern = argv[1];
        }
       else if( argc > 2)
       {
          printf("Trop d'argument fourni.\n");
       }
       else 
       {
          printf("Au moins un argument est necessaire.\n");
       }
    
        printf("Entrer la direction (.) ou (..): ");
        scanf("%s", path);
        
        int files_found = (listFilesRecursively(path, pattern, found));
        printf("Files found %d\n", files_found);
    
        return 0;
    }
    
    
    int listFilesRecursively(char *basePath, char *pattern, int found)
    {
        char path[1000];
        int i;
        struct dirent **dp;
        int num;
        DIR *dir = opendir(basePath);
    
        if (!dir)
            return 0;
            
        num = scandir(basePath, &dp, NULL, alphasort);
        for(i = 0; i < num; i++) 
        {
    
        if((dp[i]->d_type = readdir(dir)))
        {
            if (strcmp(dp[i]->d_name, ".") != 0 && strcmp(dp[i]->d_name, "..") != 0)
            {
                if((strstr(dp[i]->d_name, pattern)) != NULL)
                {
                printf("%s\n", dp[i]->d_name);
                found++;
    
                strcpy(path, basePath);
                strcat(path, "/");
                strcat(path, dp[i]->d_name);
    
                listFilesRecursively(path, pattern, found);
                }
            }
        }
        }
        return found;
        closedir(dir);
    }
    


    • Partager sur Facebook
    • Partager sur Twitter
    B2A
      10 octobre 2021 à 19:03:05

      Tu utilises un appel à scandir pour obtenir un nombre de répertoires. Mais ce nombre n'est valable que lors de l'appel à scandir, car l'environnement (en l'occurrence le système de fichiers) évolue en parallèle de notre programme. Ce qu'il faut faire, c'est tester le retour de readdir, sachant que NULL sera retourné à la fin.

      Pour en venir à readdir, ça retourne un pointeur sur une struct dirent.

      Je ne comprends pas du tout pourquoi tu assignes le résultat de readdir dans le champ d_type qui sert à indiquer un type de fichier.

      -
      Edité par Marc Mongenet 10 octobre 2021 à 19:03:19

      • Partager sur Facebook
      • Partager sur Twitter
        11 octobre 2021 à 9:13:40

        Surtout que le champ d_type n'est pas portable, il n'est pas dans la norme POSIX.
        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

        Lister le répertoire courant en ordre

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown