PDA

View Full Version : scan ricorsiva in directory...


Arpeda
08-01-2003, 12:25
ciao,
stavo facendo un programmino che a partire da una dir deve stampare tutte le sotto directory.
stavo pensando di utilizzare la ricorsione (visita in profonditā), purtroppo mi trovo di fronte i soliti problemi di implementazione e sto in questo stato :muro: :D.

per piccole dir il programmino non sembra avere problemi, ma se gli passo dir come / o /usr sfarfalla (mi stampa nomi di file quando dovrebbe stampare solo le dir)
Posto qui il programmino in allegato

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h> // questo ci va messo per la compilazione
#include <string.h>

void scan(char * dir, int l) {
struct dirent **contenuto__;
int n, i;
struct stat st;


n = scandir(dir, &contenuto__, 0, alphasort); //scandisce la dir DIR

if (n < 0)
printf("ERRORE nella lettura della dir %s\n", dir);
else {
for (i=0;i<n;i++) {
stat(contenuto__[i]->d_name, &st);
if ((S_ISDIR(st.st_mode)!=0) &&
!(strcmp(contenuto__[i]->d_name,".")==0) &&
!(strcmp(contenuto__[i]->d_name,"cwd")==0) &&
!(strcmp(contenuto__[i]->d_name,"..")==0)
) {
//if (filter(contenuto__[i]->d_name))
printf("%d, %s\n", l, contenuto__[i]->d_name);
if (chdir(contenuto__[i]->d_name)==0) {
scan(".", l+1);
chdir("..");
}
}
free(contenuto__[i]);
}
free(contenuto__);
}
}


int main() {
char *name_dir;

printf("inserisci il path assoluto della dir che vuoi browserare: ");
scanf("%as",&name_dir); //as non č POSIX
printf("\n");

if (chdir(name_dir) < 0) { //si posiziona nella dir scelta dall'utente
printf("La dir immessa non esiste\n");
exit(1);
}
scan(".", 0);

exit(1);
}


Ciao
Arpeda

soalle
08-01-2003, 13:09
Posso fare un paio di domande... per curiositā...:

Nella scanf del main (aldilā che non conosco as) non bisognerebbe passare un puntatore a carattere? facendo &name_dir di fatto non gli passi l'indirizzo di memoria del puntatore stesso? Eppoi non dovrebbe essere istanziata una area di memoria prima?


Ciaociao
Soalle

PS: in c sono un po' arrugginito...

cionci
08-01-2003, 15:16
Sė...quello č sicuramente un errore...

Arpeda
08-01-2003, 17:39
dalla man page:
a Indicates that the conversion will be s, the needed memory space for the string will be malloc'ed and the pointer to it will be assigned to the char pointer variable, which does not have to be initialized before. This flag does not exist in ANSI C.

a meno che non abbia capito male
;)

Ciao
Arpeda

soalle
08-01-2003, 18:01
:eek: trucco della as.... buono a sapersi....

cionci
08-01-2003, 18:39
Originally posted by "Arpeda"

dalla man page:
a Indicates that the conversion will be s, the needed memory space for the string will be malloc'ed and the pointer to it will be assigned to the char pointer variable, which does not have to be initialized before. This flag does not exist in ANSI C.

a meno che non abbia capito male
;)

Bella questa :)

soalle
09-01-2003, 09:20
piccola curiositā... in C ANSI per evitare buffer overflow nella lettura di una stringa, si č costretti a leggere carattere per carattere o c'č un metodo migliore?

Ciaociao
Soalle

bsummer
09-01-2003, 12:44
Scusate l'ignoranza...
Cos'e' quel "cwd" che viene usato come stringa di confronto in una delle strcmp?

Bye

Arpeda
09-01-2003, 21:07
emh ... visto che si incartava quando gli passavo la root / proprio quando trovava cwd ...
ho pensato di levarlo definitivamente :-p

cmq se guardi dentro proc lo trovi.

Cmq non avete idea del perchč non funziona correttamente?

Ciao
Arpeda