/* ---------------------------------------------------------------------- * Recorrido recursivo de un árbol de directorios mostrando los ficheros * y subdirectorios que contiene * ---------------------------------------------------------------------- */ #include #include // Funciones opendir, readdir, closedir y estructura dirent #include // Función y estructura stat void VerDirectorio ( char *nombredir ,int nivel ) { DIR *pd; // Puntero a fichero de directorio struct dirent *dirdatos; // Puntero a estructura que me devuelve readdir struct stat datostat; // Estructura con la información del sistemas sobre un fichero int i; char fichero[256]; // Abro el fichero directorio pd = opendir ( nombredir ); if ( pd == NULL ) { perror ( nombredir ); return; } /* Salto los directorios . y .. */ readdir( pd ); readdir( pd ); // Leo un el primer fichero dirdatos = readdir ( pd ); // Mientras no sea no termine el directorio while ( dirdatos != NULL ) { /* Obtengo el nombre completo para poder usar la función stat */ // Directorio y fichero sprintf(fichero,"%s/%s",nombredir,dirdatos->d_name); // Obtengo la información detallada sobre el fichero stat( fichero, & datostat ); // Me desplazo según el nivel del arbol for ( i=1 ; i<= nivel ; i++ ) putchar('\t'); // Muestro el nombre del fichero o directorio printf ( " %-20s \n", dirdatos->d_name ); /* Si es un directorio */ if ( S_ISDIR ( datostat.st_mode ) ) { // Llamada recursiva: mostrar los ficheros de ese subdirectorio VerDirectorio(fichero,nivel+1); } // Leo el siguiente fichero o directorio dirdatos = readdir (pd ); } // Cierro el fichero directorio closedir ( pd ); } /* Programa principal */ void main ( int argc, char *argv[] ) { char nombre[50]; // El nombre del directorio puede introducirse por // la linea de comandos o mediante una entrada normal if ( argc == 2 ) { strcpy(nombre,argv[1]); } else { printf(" Introducir el nombre de un directorio :"); gets(nombre); } printf("\n CONTENIDO DEL DIRECTORIO : %s \n", nombre); VerDirectorio ( nombre , 0); }