directory stream

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
afterjames
Linux 0.x
Linux 0.x
Messaggi: 64
Iscritto il: lun 14 gen 2008, 14:14

directory stream

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: directory stream

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: directory stream

Messaggio 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.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: directory stream

Messaggio da Mario Vanoni »

Reinventare la ruota?

Studia il codice GPL di find(1)!

Mario Vanoni

Avatar utente
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar 14 mar 2006, 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.2-current64
Kernel: 4.14.73
Desktop: awesomeWM
Località: Pinerolo

Re: directory stream

Messaggio 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)

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: directory stream

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: directory stream

Messaggio 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

Avatar utente
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar 14 mar 2006, 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.2-current64
Kernel: 4.14.73
Desktop: awesomeWM
Località: Pinerolo

Re: directory stream

Messaggio 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.
;)

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: directory stream

Messaggio 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

afterjames
Linux 0.x
Linux 0.x
Messaggi: 64
Iscritto il: lun 14 gen 2008, 14:14

Re: directory stream

Messaggio 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

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: directory stream

Messaggio 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

Avatar utente
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar 14 mar 2006, 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.2-current64
Kernel: 4.14.73
Desktop: awesomeWM
Località: Pinerolo

Re: directory stream

Messaggio 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

Rispondi