Ver Mensaje Individual
  #4 (permalink)  
Antiguo 31/08/2003, 22:15
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 10 meses
Puntos: 1
Muy bien, entonces se me ocurre algo como lo siguiente.

Código:
/*** Librerias estandar usadas ***/

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>



/*** Macros ***/

#define DIRECTORIO_INICIAL "/proc"  /* Directorio en donde iniciar el
                                     * procesamiento */



/*** Prototipos ***/

void listar_directorio (const char *);



/*** Funcion principal ***/

int
main (void)
{
    printf ("Listando el contenido del directorio `%s'.\n\n",
            DIRECTORIO_INICIAL);

    listar_directorio (DIRECTORIO_INICIAL);

    return 0;
}



/*** Funciones ***/

/* listar_directorio()
 *
 * Recibe el nombre de un directorio, e imprime, recursivamente, la
 * estructura de archivos bajo el directorio dado. */

void
listar_directorio (const char *nombre_dir)
{
    struct dirent *dir_info;
    struct stat    stat_info;    /* Informacion sobre cada nodo */
    size_t         tam_dir;      /* Tamanyo del nombre del directorio
                                  * recibido */
    size_t         tam_nodo;     /* Tamanyo reservado para los nombres
                                  * de los nodos */
    char          *nodo = NULL;
    DIR           *dd;           /* Descriptor de directorio */

    char sim_bufer[NAME_MAX + 1];  /* Bufer para nombres de enlaces
                                    * simbolicos */
    int  n;


    /* Chequear si el directorio recibido es un enlace simbolico */

    if (lstat (nombre_dir, &stat_info) == 0 && stat_info.st_mode & S_IFLNK){
        n = readlink (nombre_dir, sim_bufer, NAME_MAX);
        sim_bufer[n] = '\0';

        /* Imprimir enlace simbolico */
        printf ("  %s -> %s\n", nombre_dir, sim_bufer);

        return;
    }


    tam_dir = strlen (nombre_dir);

    dd = opendir (nombre_dir);

    if (! dd) {
        fprintf (stderr, "  * Error leyendo informacion desde %s\n",
                 nombre_dir);
        return;
    }

    while ((dir_info = readdir (dd))) {

        /* Saltar nodos que comiencen por `.' */

        if (dir_info->d_name[0] == '.')
            continue;


        if (! nodo) {

            tam_nodo = strlen (dir_info->d_name) + tam_dir + 2;
            nodo = (char *) malloc (sizeof (char) * tam_nodo);

        } else if (strlen (dir_info->d_name) > tam_nodo - tam_dir - 2) {

            tam_nodo = strlen (dir_info->d_name) + tam_dir + 2;
            nodo = (char *) realloc (nodo, sizeof (char) * tam_nodo);

        }

        strcpy (nodo, nombre_dir);
        strcat (nodo, "/");
        strcat (nodo, dir_info->d_name);

        if (stat (nodo, &stat_info) == 0) {
            if (stat_info.st_mode & S_IFDIR)
                listar_directorio (nodo);

            else if (stat_info.st_mode & S_IFREG)
                printf ("  %s\n", nodo);
        }
    }

    if (nodo)
        free (nodo);
}

En este ejemplo tan solo se recorre recursivamente la estructura de archivos bajo `/proc' y se lista cada archivo encontrado. Quizás te sirva al menos como guía para el recorrido sobre el sistema de archivos en tu aplicación.

Por supuesto, en caso de que necesites información sobre algunas de las funciones usadas en este ejemplo, te recomiendo que en primera instancia consultes los manuales de programación del sistema, los cuales, dicho sea de paso, fueron mi referencia mientras escribía este segmento de código. Por ejemplo, en este momento mi historial en el intérprete de comandos debe contener las siguientes líneas:


man 3 opendir
man 3 readdir
man 2 stat


:)

Saludos.