#include #include #include #include #include #include #include #include #include #include /* cherche l'entree to_find dans le répertoire dirname */ void find_file(const char*dirname, const char* to_find) { DIR *curdir=opendir(dirname); assert(curdir); struct dirent *dir_entry = readdir(curdir); assert(dir_entry); /* on parcoure la liste des fichiers du repertoire */ while(dir_entry) { if(strcmp(dir_entry->d_name, to_find) == 0) { /* fichier trouvé ! */ printf("%s/%s\n", dirname, to_find); } if((strcmp(dir_entry->d_name, ".") != 0) && (strcmp(dir_entry->d_name, "..") != 0)) { struct stat buf; int new_dirname_len = strlen(dirname) + strlen("/") + strlen(dir_entry->d_name) + 1; char* new_dirname = malloc(sizeof(char) * new_dirname_len); snprintf(new_dirname, new_dirname_len, "%s/%s", dirname, dir_entry->d_name); int ret = stat(new_dirname, &buf); assert(ret == 0); /* on cherche le fichier dans le sous-repertoire */ if(S_ISDIR(buf.st_mode)) { find_file(new_dirname, to_find); } free(new_dirname); } dir_entry = readdir(curdir); } } /* Version reentrante de find_file * cherche l'entree to_find dans le répertoire dirname * */ void find_file_r(const char*dirname, const char* to_find) { DIR *curdir=opendir(dirname); assert(curdir); /* on suppose qu'il n'y a pas de nom de fichier > 255 caracteres * voir man readdir_r pour un exemple plus robuste */ int name_max = 255; int len = offsetof(struct dirent, d_name) + name_max + 1; struct dirent *buffer = malloc(len); struct dirent *dir_entry = NULL; int ret = readdir_r(curdir, buffer, &dir_entry); assert(ret == 0); /* on parcoure la liste des fichiers du repertoire */ while(dir_entry) { if(strcmp(dir_entry->d_name, to_find) == 0) { /* fichier trouvé ! */ printf("%s/%s\n", dirname, to_find); } if((strcmp(dir_entry->d_name, ".") != 0) && (strcmp(dir_entry->d_name, "..") != 0)) { struct stat buf; int new_dirname_len = strlen(dirname) + strlen("/") + strlen(dir_entry->d_name) + 1; char* new_dirname = malloc(sizeof(char) * new_dirname_len); snprintf(new_dirname, new_dirname_len, "%s/%s", dirname, dir_entry->d_name); int ret = stat(new_dirname, &buf); assert(ret == 0); /* on cherche le fichier dans le sous-repertoire */ if(S_ISDIR(buf.st_mode)) { find_file_r(new_dirname, to_find); } free(new_dirname); } ret = readdir_r(curdir, buffer, &dir_entry); } } int main(int argc, char**argv) { if(argc<2){ fprintf(stderr, "usage: %s \n", argv[0]); return EXIT_FAILURE; } char* to_find=argv[1]; find_file(".", to_find); return EXIT_SUCCESS; }