INTRODUZIONE ALLA PROGRAMMAZIONE IN C



Funzioni di trattamento delle directory



Queste operazioni coinvolgono fondamentalmente chiamate ad appropriate funzioni. Ad esempio: int chdir(char *path) - cambia la directory a quella specificata nella stringa "path" Esempio: emulazione C del comando UNIX "cd" #include <stdio.h> main(int argc, char **argv) { if (argc < 2) {printf("Usage: %s \n", argv[0]); exit(1); } if (chdir(argv[1]) != 0) {printf("Error in chdir\n"); exit(1); } } char *getwd(char *path) Restituisce il pathname completo della directory di lavoro corrente. "path" e' un puntatore ad una stringa in cui viene ritornato il pathname. "getwd" ritorna un puntatore alla stringa, oppure NULL nel caso si verifichi un errore. scandir(char *dirname, struct direct **namelist, int (*select)(), int (*compar)()) Legge il dirname della directory e crea un array di puntatori ad ogni voce contenuta della directory, oppure "-1" per un errore. "namelist" e' un puntatore ad un array di puntatori alla struttura. (*select)() e' un puntatore ad una funzione che viene richiamata con un puntatore ad ogni voce della directory (definita in ) e potrebbe ritornare un valore diverso da 0 se la voce della directory e' inclusa nell'array. Se il puntatore e' nullo, allora verranno incluse tutte le voci della directory. L'ultimo argomento e' un puntatore ad una routine che viene passato a qsort (vedere "man qsort") - una funzione interna che sorta l'array completo. Se il puntatore e' NULL, l'array non viene sortato. alphasort(struct direct **d1, **d2) "alphasort()" e' una routine interna che sorta alfabeticamente un array. Esempio: una semplice versione dell'utility UNIX "ls" #include <sys/types.h> #include <sys/dir.h> #include <sys/param.h> #include <stdio.h> #define FALSE 0 #define TRUE!FALSE extern int alphasort(); char PATHNAME[MAXPATHLEN]; main() {int count,i; struct direct **files; int file_select(); if(getwd(pathname) == NULL) {printf("Error getting path\n"); exit(0); } printf("Current Working Directory=%s\n",pathname); count=scandir(pathname,&files,file_select,alphasort); /* if no files found, make a non-selectable menu item */ if (count <= 0) {printf("No files in this directory\n"); exit(0); } printf("Number of files=%d\n",count); for (i=1;id_name); printf("\n"); /* flush buffer */ } int file_select(struct direct *entry) {if ((strcmp(entry->d_name,".") == 0) --- (strcmp(entry->d_name,"..") == 0)) return (FALSE); else return (TRUE); } "scandir" ritorna la directory corrente (.) e la directory di livello superiore (..), come pure tutti i files contenuti; cosi' e' necessario controllare l'output, e ritornare FALSE in modo che le due directory non vengano incluse nella lista di file. Facciamo presente che "scandir" e "alphasort" hanno le definizioni nei files sys/types.h e sys/dir.h. MAXPATHLEN e "getwd" sono definite in sys/param.h. Possiamo avanzare ulteriormente e cercare files specifici. Modificheremo ora file_select() in modo che scandisca solamente i file con suffisso .c, .o o .h: int file_select(struct direct *entry) {char *ptr; char *rindex(char *s, char c); if ((strcmp(entry->d_name, ".") == 0) --- (strcmp(entry->d_name, "..") == 0)) return(FALSE); /* Check for filename extensions */ ptr=rindex(entry->d_name,'.') if ((ptr != NULL) && ((strcmp(ptr,".c") == 0) || (strcmp(ptr,".h") == 0) || (strcmp(ptr,".o") == 0) )) return(TRUE); else return(FALSE); } Facciamo notare che rindex() e' una funzione di trattamento delle stringhe, che ritorna un puntatore all'ultima occorrenza del carattere "c" nella stringa "s", oppure un puntatore NULL se "c" non e' presente nella stringa (index() e' una funzione simile, ma assegna ad un puntatore la prima occorrenza).