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

directory stream

Messaggioda afterjames » gio mag 08, 2008 12: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

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

Re: directory stream

Messaggioda targzeta » gio mag 08, 2008 12: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
414N
Iper Master
Iper Master
Messaggi: 2893
Iscritto il: mer feb 13, 2008 16:19
Slackware: current
Kernel: 3.14.23
Desktop: KDE4
Località: Bulagna
Contatta:

Re: directory stream

Messaggioda 414N » gio mag 08, 2008 12: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.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun set 03, 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

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

Reinventare la ruota?

Studia il codice GPL di find(1)!

Mario Vanoni

Avatar utente
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar mar 14, 2006 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce
Località: Salerno

Re: directory stream

Messaggioda d4z_c0nf » gio mag 08, 2008 14: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
targzeta
Iper Master
Iper Master
Messaggi: 6369
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: directory stream

Messaggioda targzeta » gio mag 08, 2008 14: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à 

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun set 03, 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

Messaggioda Mario Vanoni » gio mag 08, 2008 14: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

Avatar utente
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar mar 14, 2006 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce
Località: Salerno

Re: directory stream

Messaggioda d4z_c0nf » gio mag 08, 2008 15: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.
;)

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun set 03, 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

Messaggioda Mario Vanoni » gio mag 08, 2008 16: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

afterjames
Linux 1.0
Linux 1.0
Messaggi: 64
Iscritto il: lun gen 14, 2008 14:14

Re: directory stream

Messaggioda afterjames » ven mag 09, 2008 9: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

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

Re: directory stream

Messaggioda conraid » ven mag 09, 2008 12: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
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar mar 14, 2006 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce
Località: Salerno

Re: directory stream

Messaggioda d4z_c0nf » ven mag 09, 2008 12: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


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite