Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Lectura de Ficheros/Directorios en Unix

Estas en el tema de Lectura de Ficheros/Directorios en Unix en el foro de C/C++ en Foros del Web. Hola estoy intentando leer en un directorio los ficheros q contiene para asi poder sakar su tamaño y GID , el programa seria el siguiente ...
  #1 (permalink)  
Antiguo 06/10/2007, 08:57
 
Fecha de Ingreso: marzo-2007
Mensajes: 9
Antigüedad: 17 años, 9 meses
Puntos: 0
Lectura de Ficheros/Directorios en Unix

Hola estoy intentando leer en un directorio los ficheros q contiene para asi poder sakar su tamaño y GID , el programa seria el siguiente :


Ahora hice algunos cambios :
#include<stdio.h>
#include<dirent.h>
#include<sys/stat.h>
#include<sys/types.h>

int main(){

DIR *dir_act;
struct dirent *dirp;
struct stat fich;
char *nombre;
char *ruta= "/bin";
int arch_gid;
double siz_arch;

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

dirp = readdir(dir_act);

while((dirp = readdir(dir_act)) != NULL){

nombre=dirp->d_name;
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 -> %f \n", siz_arch);

dirp=readdir(dir_act);
}
closedir(dir_act);

}

El problema lee los archivos y me dice el nombre correcto de kada uno pero el GID y el Tamaño del archivo es incorrecto, yo creo que el problema puede ser en el campo ruta , ya ke kuando le digo q busque en la ruta "." me saka los resultados correctos. No entiendo el error, si alguien le puede echar un ojo me haria un gran favor.

Gracias :)
  #2 (permalink)  
Antiguo 06/10/2007, 13:54
 
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 :)
  #3 (permalink)  
Antiguo 06/10/2007, 16:09
 
Fecha de Ingreso: marzo-2007
Mensajes: 9
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Lectura de Ficheros/Directorios en Unix

Woho! gracias tio , me dijeron esta tarde que tenia que ir formando la ruta con concatenaciones y creo q lo tenia medio resuelto pero con tu ayuda, ya lo tengo perfecto :D . Ahora tengo que añadir una opcion de recursividad, pero creo q eso lo tengo dominado :)

Wenas noxes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:17.