Ver Mensaje Individual
  #2 (permalink)  
Antiguo 06/10/2007, 13:54
mhatter
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Lectura de Ficheros/Directorios en Unix

Lo que sucede es que dentro del ciclo, tu tienes en dirp->d_name el nombre de cada entrada ubicada en el directorio especificado por ruta, pero ese nombre es relativo a esa ruta. Entonces, si ejecutas el programa desde una carpeta diferente de "/bin" (o aquella que definas en ruta), las llamadas a stat() pensarán que estás buscando esos archivos en la carpeta actual, y si no existen, devuelve un valor de error (que tu programa no verifica).

Un ejemplo de cómo podría evitarse este problema sería construir la ruta completa a pasarle a stat(), concatenando las diferentes partes de la ruta:

Código:
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>

#define TAM_RUTA 1024

int main()
{
    DIR *dir_act;
    struct dirent *dirp;
    struct stat fich;
    char nombre[TAM_RUTA + 1];
    char *ruta= "/bin";
    int arch_gid;
    double siz_arch;
    size_t ruta_tam;

    if((dir_act = opendir(ruta)) == NULL)
        printf("Error al abrir el directorio\n");

    ruta_tam = strlen(ruta);

    while((dirp = readdir(dir_act)) != NULL){
        /* Empezar con la ruta base */
        strncpy(nombre, ruta, TAM_RUTA);

        /* Pegar un separador de directorio */
        strncat(nombre, "/", TAM_RUTA - ruta_tam);

        /* Y finalmente unir con el nombre del archivo actual */
        strncat(nombre, dirp->d_name, TAM_RUTA - ruta_tam - 1);

        printf("El nombre del archivo es : %s\n" , nombre );
        stat(nombre,&fich);
        arch_gid = fich.st_gid;
        siz_arch= fich.st_size;

        printf("GID -> %d \n", arch_gid);
        printf("tamaño -> %.0f \n", siz_arch);
    }

    closedir(dir_act);
}
P.D: Quité un par de llamadas a readdir() de más, que producían que más o menos la mitad de los archivos no fueran listados. No sé si lo hacías por una razón especial, pero este ejemplo trata de hacer lo que te entendí que querías :)