Repository 32bit  Forum
Repository 64bit  Wiki

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.

directory stream

Messaggioda afterjames » gio mag 08, 2008 11:17

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
afterjames
Linux 1.0
Linux 1.0
 
Messaggi: 64
Iscritto il: lun gen 14, 2008 14:14

Re: directory stream

Messaggioda targzeta » gio mag 08, 2008 11:21

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6149
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: directory stream

Messaggioda 414N » gio mag 08, 2008 11:41

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.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2877
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: directory stream

Messaggioda Mario Vanoni » gio mag 08, 2008 12:27

Reinventare la ruota?

Studia il codice GPL di find(1)!

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

Re: directory stream

Messaggioda d4z_c0nf » gio mag 08, 2008 13:08

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
d4z_c0nf
Packager
Packager
 
Messaggi: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce

Re: directory stream

Messaggioda targzeta » gio mag 08, 2008 13:48

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6149
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: directory stream

Messaggioda Mario Vanoni » gio mag 08, 2008 13:57

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: directory stream

Messaggioda d4z_c0nf » gio mag 08, 2008 14:22

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.
;)
Avatar utente
d4z_c0nf
Packager
Packager
 
Messaggi: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce

Re: directory stream

Messaggioda Mario Vanoni » gio mag 08, 2008 15:00

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: directory stream

Messaggioda afterjames » ven mag 09, 2008 8:53

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
afterjames
Linux 1.0
Linux 1.0
 
Messaggi: 64
Iscritto il: lun gen 14, 2008 14:14

Re: directory stream

Messaggioda conraid » ven mag 09, 2008 11:03

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
conraid
Staff
Staff
 
Messaggi: 11987
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: directory stream

Messaggioda d4z_c0nf » ven mag 09, 2008 11:13

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
Avatar utente
d4z_c0nf
Packager
Packager
 
Messaggi: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti