Pagina 1 di 1
directory stream
Inviato: gio 8 mag 2008, 12:17
da afterjames
Salve a tutti.Vorrei realizzare una semplice funzione che legge il contenuto di una directory, esplorando ricorsivamente anche le sottodirectory.Per listare i file ho fatto così, e sembra funzionare:
Codice: Seleziona tutto
DIR *dirStream;
dirStream=opendir(argv[1]); //da riga di comando ottengo il nome della directory
if((errno==ENOTDIR)||(errno== ENOENT)){
printf("Directory not exist or path is not a directory..\n");
return -1;
}
struct dirent *dirp=readdir(dirStream);
while(dirp!=NULL){
printf("Nome file %s ",dirp->d_name);
char *path=(char*)malloc((strlen(argv[1])+strlen(dirp->d_name)+2)*sizeof(char));
struct stat *buf;
if(dirp->d_name[0]!='.'){
strcpy(path,argv[1]);
strcat(path,dirp->d_name);
lstat(path,buf); //necessaria per verificare se è una directory o no
if(S_ISDIR(buf->st_mode)){
printf("IS A DIRECTORY!!!"); //qui dovrei continuare l'esplorazione
}
}
printf("\n");
dirp=readdir(dirStream);
strcpy(path,"");
free(path);
}
Ora il mio problema è come esplorare anche le sottodirectory.Avevo provato a costruire il nome della sottodirectory(variabile path, concatenando anche il carattere "/") e a ripetere la procedura ma ottengo sempre un errore di segmentazione.Forse non si possono aprire due directory stream contemporaneamente.Spero di essermi fatto capire!Grazie intanto
Re: directory stream
Inviato: gio 8 mag 2008, 12:21
da targzeta
Un path è di per se un albero, e gli alberi si esplorano con funzioni ricorsive. Come lo vuoi esplorare, in larghezza o in lunghezza? Nel senso, vuoi controllare prima tutti i figli della directory principale e poi scendere al primo figlio, oppure vuoi esplorare prima tutti i primi figli?
Spero anche io di essermi spiegato

,
Spina
Re: directory stream
Inviato: gio 8 mag 2008, 12:41
da 414N
Come suggerito da spina, ti conviene creare una funzione ricorsiva che, preso in pasto un path, ne elenca i contenuti e, se trova una directory, chiama un'altra "istanza" di sé stessa appendendo in fondo al path in suo possesso quello della subdir.
Re: directory stream
Inviato: gio 8 mag 2008, 13:27
da Mario Vanoni
Reinventare la ruota?
Studia il codice GPL di find(1)!
Mario Vanoni
Re: directory stream
Inviato: gio 8 mag 2008, 14:08
da d4z_c0nf
Mario Vanoni ha scritto:Reinventare la ruota?
Studia il codice GPL di find(1)!
Mario Vanoni
Offtopic: Mario ti volevo chiedere: ma perchè per i comandi metti sempre il suffisso (1)
Re: directory stream
Inviato: gio 8 mag 2008, 14:48
da targzeta
d4z_c0nf ha scritto:....
Offtopic: Mario ti volevo chiedere: ma perchè per i comandi metti sempre il suffisso (1)
Offtopic: Per indicarti che la sua pagina di manuale è la 1, e quindi ti sta anche dicendo che è un comando
Spina
Re: directory stream
Inviato: gio 8 mag 2008, 14:57
da Mario Vanoni
d4z_c0nf ha scritto:Mario Vanoni ha scritto:Reinventare la ruota?
Studia il codice GPL di find(1)!
Mario Vanoni
Offtopic: Mario ti volevo chiedere: ma perchè per i comandi metti sempre il suffisso (1)
man 7 man-pages
Mario Vanoni
Re: directory stream
Inviato: gio 8 mag 2008, 15:22
da d4z_c0nf
Mario Vanoni ha scritto:d4z_c0nf ha scritto:Mario Vanoni ha scritto:Reinventare la ruota?
Studia il codice GPL di find(1)!
Mario Vanoni
Offtopic: Mario ti volevo chiedere: ma perchè per i comandi metti sempre il suffisso (1)
man 7 man-pages
Mario Vanoni
sì avevo capito che riguardava le sezioni del man, mi chiedevo solo perchè utilizzassi questa nomenclatura.

Re: directory stream
Inviato: gio 8 mag 2008, 16:00
da Mario Vanoni
d4z_c0nf ha scritto:
sì avevo capito che riguardava le sezioni del man, mi chiedevo solo perchè utilizzassi questa nomenclatura.

find(1) e mount(8), non e` piu` chiaro?
Mario Vanoni
Re: directory stream
Inviato: ven 9 mag 2008, 9:53
da afterjames
Si, volevo reinventare la ruota!Ho usato una funzione ricorsiva..E sembra funzionare.Vi posto il codice per chi interessato:
void leggiDirectory(char *dirpath){
printf("Esploro\n");
DIR *dirStream;
dirStream=opendir(dirpath);
if((errno==ENOTDIR)||(errno== ENOENT)){
printf("Directory not exist or path is not a directory..\n");
return;
}
struct dirent *dirp=readdir(dirStream);
struct stat *buf=(struct stat*)malloc(sizeof(struct stat));;
while(dirp!=NULL){
if(dirp->d_name[0]!='.')
printf("Nome file %s ",dirp->d_name);
char *path=(char*)malloc((strlen(dirpath)+strlen(dirp->d_name)+2)*sizeof(char));
if(dirp->d_name[0]!='.'){
strcpy(path,dirpath);
strcat(path,dirp->d_name);
lstat(path,buf);
if(S_ISDIR(buf->st_mode)){
strcat(path,"/");
printf("IS A DIRECTORY!!!");
leggiDirectory(path);
}
}
printf("\n");
dirp=readdir(dirStream);
strcpy(path,"");
free(path);
}
closedir(dirStream);
}
Grazie!Sicuramente quello della gapil è scritto meglio..

Re: directory stream
Inviato: ven 9 mag 2008, 12:03
da conraid
d4z_c0nf ha scritto:
sì avevo capito che riguardava le sezioni del man, mi chiedevo solo perchè utilizzassi questa nomenclatura.

Alcune volte è obbligatorio farlo, perché le pagine del man sono diverse per la stessa voce, per esempio mkdir o tanti altri
Re: directory stream
Inviato: ven 9 mag 2008, 12:13
da d4z_c0nf
conraid ha scritto:d4z_c0nf ha scritto:
sì avevo capito che riguardava le sezioni del man, mi chiedevo solo perchè utilizzassi questa nomenclatura.

Alcune volte è obbligatorio farlo, perché le pagine del man sono diverse per la stessa voce, per esempio mkdir o tanti altri
Sì sì lo so
lo stesso mount che Mario citava la descrizione specifica per il comando "mount" sta nella sezione 8 del manuale.
Questo lo so mi chiedevo perchè lo facesse, credo lo faccia per verificare noi stessi le cose che dice o che chiediamo,
rock