Capítulo 23. Trabajo con directorios 23.1. Objetivos Manipular directorios, obtener información sobre ficheros y examen de un pequeño programa recursivo. Utilización de un depurador para seguir un programa. 23.2. Documentación de las transparencias Las transparencias relevantes para realizar esta práctica son: - Páginas 43-46 de las transparencias de C - Páginas 51-52 de las transparencias de Bibliotecas de C y llamadas al sistema 23.3. Requisitos Estudio de las operaciones de directorio: llamada al sistema (getdents) y rutinas de conveniencia (opendir, closedir, readdir, etc), de las de obtener información sobre un fichero (stat, lstat y fstat), y del depurador. 23.4. Especificación Estudie el siguiente programa, arbol.c , que lista recursivamente los directorios que se le pasan como parámetros. #include #include #include #include #include #include <stdio.h> <sys/types.h> <sys/stat.h> <limits.h> <dirent.h> <stdlib.h> int nivel = 0; void tree (char* path) { DIR* dirp; struct dirent* dp; if ((dirp = opendir (path)) == NULL) { perror (path); return; } while ((dp = readdir (dirp)) != NULL) { struct stat buf; char fichero [PATH_MAX]; int i; if ((strcmp (dp->d_name, ".") == 0) || (strcmp (dp->d_name, "..") == 0)) continue; sprintf (fichero, "%s/%s", path, dp->d_name); for (i = 0; i < nivel; i ++) printf (" "); 1 Capítulo 23. Trabajo con directorios printf ("%s\n", dp->d_name); if (lstat (fichero, & buf) == -1) { perror(fichero); exit(1); } if ((buf.st_mode & S_IFMT) == S_IFDIR) { nivel++; tree (fichero); nivel--; } } closedir (dirp); } int main (int argc, char* argv []) { int i; if (argc == 1) tree ("."); else for (i = 1; i < argc; i++)tree (argv[i]); } • Sitúese en su directorio de trabajo con cd y ejecútelo sin parámetros y con diversos parámetros, para comprender su funcionamiento. Puede probar con ., .., /bin, /boot, ambos (/boot /bin), etc. • Sígalo con un depurador (gdb o ddd), pasándole como argumento un directorio con subdirectorios (por ejemplo /etc). Sigalo paso a paso y poniendo puntos de parada. Vea el contenido de variables relevantes, incluidas las asignadas automáticamente en la pila en las llamadas recursivas. • Modifíquelo para que además de nombre del fichero o directorio muestre el número de inodo. Utilice el depurador para ayudarse. 23.5. Ficheros ofrecidos En el directorio dir: • Programa arbol.c. • Una solución compilada: arbol2. 23.6. Resultados pedidos • El módulo fuente: arbol2.c. 2