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

Mostrar directorios y contenido de ficheros .txt.

Estas en el tema de Mostrar directorios y contenido de ficheros .txt. en el foro de C/C++ en Foros del Web. Buenas, qué tal: Estoy realizando un programa que recibe dos parámetros, siendo el primero la ruta de un directorio y el segundo un valor numérico. ...
  #1 (permalink)  
Antiguo 29/12/2009, 08:11
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 1
Mostrar directorios y contenido de ficheros .txt.

Buenas, qué tal:

Estoy realizando un programa que recibe dos parámetros, siendo el primero la ruta de un directorio y el segundo un valor numérico.

El programa en cuestión debe mostrar el contenido del directorio pasado por parámetro, el número de caracteres pasado como segundo parámetro de los ficheros de texto que encuentre en el mismo, además del número de elementos de los directorios que haya en este, por ejemplo, si el directorio /home/Prueba contiene los siguientes archivos:

leeme.txt
prueba.c
cosa.pdf
autores.txt
doc/
documento.txt
privado/
secreto.jpeg
altosecreto.pdf
publico/
listado.txt
prueba.pdf
archivo/
basedatos.mdb
prologo.txt

Y se ejecuta el comando ./listadoFichero /home/Prueba 7, la salida debe ser:

Listado de "/home/informatica/pruebalistacosas"
Fichero leeme.txt: primeros 7 caracteres [Esto es]
Fichero prueba.c
Fichero cosa.pdf
Fichero autores.txt: primeros 7 caracteres [Luis Ma]
Directorio doc: 4 elementos dentro
Directorio archivo: 1 elemento dentro
Fichero prologo.txt: primeros 7 caracteres [Este pr]
Fin del listado

Pues bien, tengo el siguiente código:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, char *argv[]){

    DIR *dir;
    struct dirent *directorio;

    if((dir = opendir(argv[1])) == NULL){
        perror("La ruta especificada no existe.\n");
        exit(-1);
    }

    printf("Listado de: %s\n\n", argv[1]);

    while((directorio = readdir(dir)) != NULL){
        if((strcmp(directorio->d_name, ".") != 0) && (strcmp(directorio->d_name, "..") != 0)){
            printf("%s\n", directorio->d_name);
        }
    }

    printf("\nFin del listado");

    closedir(dir);

    return 0;

}
El cual muestra los directorios y archivos del directorio especificado, no obstante, no sé cómo comprobar si un archivo es un directorio o un fichero, he intentado utilizar las funciones S_ISDIR y S_ISREG, pero no funcionan correctamente, si alguien tiene alguna idea de cómo funcionaría correctamente, que lo postee si no es demasiada molestia.

Gracias de antemano.
  #2 (permalink)  
Antiguo 29/12/2009, 10:27
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Mostrar directorios y contenido de ficheros .txt.

No son funciones esas sino mascaras, si estas en *NIX las podes usar con el campo d_type en directorio, ejemplo:

Código:
if (directorio->d_type & S_ISDIR)
{
  printf("es un directorio\n");
}
Si estas en Windows tenes que usar la funcion stat y el campo st_mode de la misma manera (con las mascaras que mencionaste).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 29/12/2009, 10:44
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Mostrar directorios y contenido de ficheros .txt.

Eternal Idol, en este caso trabajo en un entorno Linux.

Lo que has escrito produce un error de compilación tipo 'S_ISDIR' undeclared.
  #4 (permalink)  
Antiguo 29/12/2009, 10:57
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Mostrar directorios y contenido de ficheros .txt.

A ver asi (odio la documentacion de *NIX):
Código:
if (directorio->d_type & DT_DIR)
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 29/12/2009, 11:17
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Mostrar directorios y contenido de ficheros .txt.

Gracias Eternal Idol, de esa forma funciona correctamente.

Código:
            if(directorio->d_type & DT_DIR){
                printf("Directorio %s: \n", directorio->d_name);
            }
            else if(directorio->d_type & DT_REG){
                printf("Fichero %s: \n", directorio->d_name);
            }
Con DT_REG puedo saber qué ficheros son .txt e imprimir el número de caracteres pasado como segundo parámetro, pero, ¿sabrías cómo contar el número de elementos (directorios y ficheros) dentro de otro directorio? Es decir, con vistas al ejemplo anterior, el directorio doc tiene cuatro elementos dentro, por tanto, el programa debe mostrar este número.
  #6 (permalink)  
Antiguo 29/12/2009, 11:22
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Mostrar directorios y contenido de ficheros .txt.

De nadas; podrias hacer una funcion que con opendir, readdir y una variable devolviera el total de elementos encontrados.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 29/12/2009, 13:32
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Mostrar directorios y contenido de ficheros .txt.

Gracias Eternal Idol, he intentado hacerlo así, pero me aparece un error de ejecución tipo "Segmentation fault (core dumped)" con el siguiente código:

Código:
            if(directorio->d_type & DT_DIR){
                printf("Directorio %s: ", directorio->d_name);
                DIR *dirAux;
                struct dirent *directorioAux;
                dirAux = opendir(directorio->d_name);
                n=0;
                while((directorioAux = readdir(dirAux)) != NULL){
                    n++;
                }
                printf("%d elementos dentro\n", n);
                closedir(dirAux);
            }
            else if(directorio->d_type & DT_REG){
                printf("Fichero %s\n", directorio->d_name);
            }
¿Sabrías a que se debe?
  #8 (permalink)  
Antiguo 29/12/2009, 14:45
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Mostrar directorios y contenido de ficheros .txt.

Supongo que el problema es que dirAux es 0 al fallar opendir (ojo que le estas pasando el nombre del directorio sin el path) y entonces al llamar a readdir el handle es invalido.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 30/12/2009, 04:19
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Mostrar directorios y contenido de ficheros .txt.

Pues sí Eternal Idol, ahí estaba el problema, ya lo he solucionado; ahora me ha surgido otro:

Código:
            else if(directorio->d_type & DT_REG){
                printf("Fichero %s: ", directorio->d_name);
                strcpy(cad, argv[1]);
                strcat(cad, directorio->d_name);
                fd = open(cad, O_RDONLY);
                read(fd, buf, argv[2]);
                printf("%s\n", buf);
                close(fd);
            }
Con ese código pretendo mostrar el número de caracteres pasado por parámetro de los ficheros de texto, pero sólo muestra basura, ¿sabrías a que se debe?
  #10 (permalink)  
Antiguo 30/12/2009, 05:41
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Mostrar directorios y contenido de ficheros .txt.

Viendolo unicamente no se me ocurre mucho, puede que sean archivos binarios tal vez. No se que es buf tampoco. Lo que podes hacer es depurarlo, compilas con -g y depuras con gdb, sino comproba con algunos printf el valor de fd y de cad y que retorna read.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 30/12/2009, 05:54
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Mostrar directorios y contenido de ficheros .txt.

La variable buf es donde se vuelca lo leído con la función read, por tanto, es la que pretendo mostrar.

Con respecto a los archivos binarios, no hay ninguno en ese directorio, los que hay están en el ejemplo, es decir, sólo hay directorios, ficheros de texto, .pdf y poco más.
  #12 (permalink)  
Antiguo 30/12/2009, 06:42
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Mostrar directorios y contenido de ficheros .txt.

Si pero que tipo de variable es buf. ¿Es un array de char's de un tamaño fijo por ejemplo? A eso me referia.

Los pdf son binarios, en teoria te deberia funcionar con los txt. ¿Que valor devuelve read? ¿fs es distinto de cero? Comproba que el path sea correcto, eso dependera de como le pases la linea de comandos, si le pasas /home/dir por ejemplo se construiria mal al hacer strcpy y strcat.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #13 (permalink)  
Antiguo 30/12/2009, 07:02
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Mostrar directorios y contenido de ficheros .txt.

Gracias por tus respuestas Eternal Idol, lo he solucionado de otra forma.

Sólo tengo un par de dudas más; la primera, no sé cómo inicializar el buf (cadena de caracteres) a nada, he intentado algo como lo siguiente:

Código:
                for(i=0;i<atoi(argv[2]);i++)
                    buf[i]=""; // strcpy(buf[i], "");
La segunda, ¿cómo puedo reconocer los ficheros .txt para que lea sólo de estos ficheros y no de los demás, como por ejemplo, de ficheros .pdf?
  #14 (permalink)  
Antiguo 30/12/2009, 07:46
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Mostrar directorios y contenido de ficheros .txt.

De nadas

La mejor manera de hacerlo es usando memset para llenarlo de ceros:

Código:
memset(buf, 0, atoi(argv[2]);
Si lo queres hacer manualmente es la misma logica de tu codigo (aunque seria mejor solo calcular el resultado del atoi una vez):
Código:
buf[i] = '\0'; //"" es cadena, '' es caracter tambien podia ser buf[i] = 0;
Sobre la segunda pregunta no se como hacerlo, si es que se puede, le di una ojeada al viejo libro "UNIX Programacion Avanzada" y al menos si podes ver si es un ejecutable con stat y el campo st_mode.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #15 (permalink)  
Antiguo 30/12/2009, 09:17
 
Fecha de Ingreso: diciembre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Mostrar directorios y contenido de ficheros .txt.

Gracias Eternal Idol, rellenando la cadena de caracteres con ceros ha sido la solución.

Sólo falta reconocer los archivos .txt.
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 06:54.