/* Semplice File Searcher Controlla anche nelle sottodirectory grazie alla funzione ricorsiva search_file() Coded by __GiReX__ */ #include #include #include #include #define MAX_FOUNDS 25 void usage(char *prog_name); char **search_file(char *dir_name, char *file_name); int main(int argc, char *argv[]) { char **founds = NULL, current[FILENAME_MAX] = {0}; if(argc < 2) { usage(argv[0]); return 1; } if(argc == 2) { getcwd(current, FILENAME_MAX); founds = search_file(current, argv[1]); } else { chdir(argv[2]); founds = search_file(argv[2], argv[1]); } if(founds != NULL) { while(*founds) { printf("%s\n", *founds); founds++; } } else return 1; return 0; } char **search_file(char *dir_name, char *file_name) { DIR *dirent = NULL; struct dirent *dinfo = NULL; static int founds = 0; static char dir[FILENAME_MAX] = {0}, *names[MAX_FOUNDS] = {NULL}; if(!(dirent = opendir(dir_name))) { fprintf(stderr, "Impossibile aprire la directory %s\n", dir_name); return NULL; } while(dinfo = readdir(dirent)) { if(!strcmp(dinfo->d_name, ".") || !strcmp(dinfo->d_name, "..")) continue; if(!strcmp(dinfo->d_name, file_name)) { names[founds] = (char*) malloc(FILENAME_MAX); if(names[founds] == NULL) { fprintf(stderr, "Errore in malloc()\n"); return names; } else { sprintf(names[founds], "%s/%s", dir_name, dinfo->d_name); founds++; } } if(!chdir(dinfo->d_name)) { sprintf(dir, "%s/%s", dir_name, dinfo->d_name); search_file(dir, file_name); chdir(".."); getcwd(dir_name, FILENAME_MAX); } } closedir(dirent); return names; } void usage(char *prog_name) { printf("\nSimply File Searcher, coded by __GiReX__\n"); printf("Usage: %s [DIRECTORY]\n\n", prog_name); }