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.. :D

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