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);
}
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
Surtout que le champ d_type n'est pas portable, il n'est pas dans la norme POSIX.
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.
git is great because Linus did it, mercurial is better because he didn't.