#include #include #include #include #include #include #include //********************************************** // strutture e variabili globali //********************************************** //struttura degli oggetti della lista delle cartelle typedef struct d{ char path[MAXPATHLEN]; struct d *next; }mydir; //puntatori utili mydir *testa,*coda,*appoggio; //path della cartella aperta char start[MAXPATHLEN],current[MAXPATHLEN]; //********************************************** // prototipi delle funzioni //********************************************** void controlla_input(int ,char *);//funzione che controlla i dati passati da shell dall'utente void naviga_cartella(DIR *);//funzione che visita una cartella aperta int main(int argc, char *argv[]){ DIR *directory; controlla_input(argc,argv[1]); //setto come prima cartella da visitare quella specificata dall'utente da shell testa=(mydir*)calloc(1,sizeof(mydir)); strcpy(testa->path,start); testa->next=NULL; coda=testa; while(testa!=NULL){ directory=opendir(testa->path); if(directory!=NULL){ //aperta la prima cartella della lista, la visito printf("\naperto %s\n",testa->path); naviga_cartella(directory); } else printf("non aperto %s\n",testa->path); //faccio avanzare il puntatore alla testa della lista e libero la memoria usata appoggio=testa; testa=testa->next; free(appoggio); closedir(directory); } return 0; } void controlla_input(int c,char *arg){ //controllo i dati in ingresso da shell if(c==1){ //nessun path specificato, parto dalla dir del programma getwd(start); printf("nessun path specificato,\nparto da %s\n",start); } else{ strcpy(start,arg); if(start[0]=='/'){ //specificato path assoluto printf("specificato path assoluto,\nparto da %s\n",start); } else{ //specificato path relativo alla dir del programma getwd(start); strcat(start,"/"); strcat(start,arg); printf("specificato path relativo alla dir del programma,\nparto da %s\n",start); } } } void naviga_cartella(DIR *directory){ struct dirent *dent; char curr[MAXPATHLEN]; //prendo il primo oggetto della directory corrente dent=readdir(directory); while(dent!=NULL){ //ciclo nella cartella aperta, quindi setto come parametro il path della cartella aperta strcpy(current,"\0"); strcpy(current,testa->path); if(dent->d_type==4){ //trovata un'altra cartella, controllo che non siano cazzate if(strcmp(".",dent->d_name)!=0 && strcmp("..",dent->d_name)!=0 && strcmp(".DS_Store",dent->d_name)!=0){ //non sono cazzate tipo . o .. quindi posso aggiungerla alla lista delle cartelle da aprire strcpy(curr,"\0"); strcpy(curr,current); appoggio=(mydir*)calloc(1,sizeof(mydir)); strcpy(appoggio->path,strcat(strcat(curr,"/"),dent->d_name)); appoggio->next=NULL; coda->next=appoggio; coda=appoggio; printf("trovata directory %s,\naggiunta in coda alla lista delle cartelle\n",coda->path); } } else{ //trovato un file generico printf("trovato altro di nome %s, ci faccio i conti\n",dent->d_name); //qui chiamo la funzione che fa le statistiche } //prendo il successivo oggetto della directory dent=readdir(directory); } }