Buenas, estaba viendo un trozo de codigo y no comprendi:
les dejo el trozo de la funcion y luego comentamos la duda:
void dir(char *path) //funcion recursiva; se llama asimisma para analizar los subdirectorios de directorios
{
DIR *dirp;
struct dirent *dp;
static nivel=1;
struct stat buf;
int ok,i;
char fichero[256],tipo;
if((dirp=opendir(path))==NULL)
{
perror("error path");
exit(-1);
}
while((dp=readdir(dirp))!=NULL){
if(EQ(dp->d_name,"..") || EQ(dp->d_name,"."))
continue;
sprintf(fichero,"%s/%s",path,dp->d_name);
if(stat(fichero,&buf)==-1){
printf("Haciendo stat a fichero: %s\n",fichero);
perror("stat");
}
if((buf.st_mode & S_IFMT)==S_IFDIR)
{
for(i=0;i<nivel;i++)
printf("\t");
fprintf(stdout,"(d) %s\n",dp->d_name);
++nivel;
dir(fichero);
--nivel;
}
else{
for(i=0;i<=nivel;i++)
printf("\t");
fprintf(stdout,"(f) %s\n",dp->d_name);
}
}
}
Esta es la funcion, consiste en un simple ls, solo que desplazando los directorios/ficheros que se encuentran en otros subdirectorios y demas... la salida es mas o menos asi:
./dir3 directorios/
(f) pepa
(d) dir1
(f) juanca
(f) antonio
(f) oliete
(d) dir2
(f) cesar
(f) pedro
(f) pepe
(f) xavi
Como vemos, los ficheros que forman parte de un subdirectorio se tabulan mas.Mi duda consiste en esto:
if((buf.st_mode & S_IFMT)==S_IFDIR)
{
for(i=0;i<nivel;i++)
printf("\t");
fprintf(stdout,"(d) %s\n",dp->d_name);
++nivel;
dir(fichero);
--nivel;
}
Mientras i sea menor que nivel tabulamos, eso correcto, luego imprimimos el nombre de directorio, incrementamos nivel y llamamos otra vez a la funcion para examinar los ficheros del directorio. Vale, mi pregunta es, como se decrementa nivel? Porque segun lo veo yo, siempre que entre en el if, se llama a la funcion otra vez, y no da tiempo a que se decremente, no se, quiza soy yo que estoy espeso espeso hoy, y es muy posible que sea esto, pero esque no le veo el que.
Ya que, si el fichero a analizar es directorio, incrementamos nivel, y le pasamos de modo recursivo el path para analizar los ficheros que contiene, pero viendolo asi, nunca se decrementaria nivel.
Era una duda, a ver si me la pueden solucionar, gracias de antemano