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

Impresion de Directorios/Ficheros -tree

Estas en el tema de Impresion de Directorios/Ficheros -tree en el foro de C/C++ en Foros del Web. Wenas , alguien sabe alguna pagina o ejemplo donde pueda mirar como realizar la implementacion de la impresion ,en lenguaje C, de -tree en sistemas ...
  #1 (permalink)  
Antiguo 09/10/2007, 05:01
 
Fecha de Ingreso: marzo-2007
Mensajes: 9
Antigüedad: 17 años, 9 meses
Puntos: 0
Impresion de Directorios/Ficheros -tree

Wenas , alguien sabe alguna pagina o ejemplo donde pueda mirar como realizar la implementacion de la impresion ,en lenguaje C, de -tree en sistemas unix?

El tipo de impresion es algo como esto :

Directorio
[tab]Fichero
[tab]Fichero
Directorio
[tab]Subdirectorio
[tab][tab]Fichero
..

Aun no empece a pensar sobre ello, solo era para ver si alguien conocia alguna pagina , supongo q me pondre a la tarde a intentarlo .

Muchas gracias. :)
  #2 (permalink)  
Antiguo 10/10/2007, 16:41
 
Fecha de Ingreso: marzo-2007
Mensajes: 9
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Impresion de Directorios/Ficheros -tree

Okey de momento llevo esto :
Código:
#include<stdio.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include <stdlib.h>

//Prototipos
void busqueda(char [],char [],int);

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

	char user [PATH_MAX];
	char ruta [PATH_MAX];
	int tab=0;	

	strcpy(user,argv[1]); // Pillamos el nombre del usuario // NO IMPORTA SI HAY ERROR AL NO AÑADIR EL NOMBRE DEL USUARIO // SOLO ES PRUEBA	
	getcwd(ruta,PATH_MAX); // Pillamos el directorio actual.

	busqueda(user,ruta,tab);//Llamamos la funcion recursiva de busqueda de Directorios/archivos.
	
}
void busqueda(char user[],char ruta[],int tab){

	DIR *directorio;
	struct dirent *fichero;
	struct stat fich;	
	char ficheros [PATH_MAX];
	
	int i;	

	directorio = opendir(ruta);
	if(directorio==NULL){
		printf("Error al abrir el directorio\n");
		exit(-1);
	}
	while ( (fichero=readdir(directorio)) != NULL ){
		if ( strcmp(fichero->d_name, "..") != 0 && strcmp(fichero->d_name, ".") != 0 ){
			strcpy (ficheros, ruta);
			strcat (ficheros, "/");
			strcat (ficheros, fichero->d_name);
			if ( (lstat(ficheros, &fich)) == -1 ){	//obtenemos la informacion del archivo

					fprintf( stderr, "\nNo se pudo obtener la informacion del fichero:\n" );
					fprintf( stderr, "\t%s\n\n", ficheros);
			}			
			//-tree? xD
			if(S_ISDIR(fich.st_mode)){ //Encontramos un directorio, y aumentamos tab+1 para tabular los archivos q contiene
				for(i=0;i<tab;i++) 
					printf("\t");								
				printf("%s \n",fichero->d_name);
				tab=tab+1;							
			}
			else{ 
				for(i=0;i<tab;i++)
					printf("\t");						
				printf("%s \n",fichero->d_name);
			}	
			//recursiva
			if(S_ISDIR(fich.st_mode))	
				busqueda(user,ficheros,tab);		
		}
	}
	closedir(directorio);	
}
Por supuesto , el problema solo radica en la impresion "-tree" . Ahora mismo lo unico que hce es tabular , cuando ve que es un directorio, pero no se volver al principio de linea para el siguiente. Alguien me puede echar una manita?

Gracias.
  #3 (permalink)  
Antiguo 10/10/2007, 21:38
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Impresion de Directorios/Ficheros -tree

Bueno, la verdad es que no estoy completamente seguro de qué es lo que quieres exactamente.

He probado el código como lo has publicado, y está muy cerca de lo que me parece buscas; imprime correctamente los nombres de directorios y archivos que encuentra, recursivamente. Falla un poco en el número de tabulaciones que imprime en algunas líneas, pero la lógica de fondo se ve que está bien planteada.

Te propongo esta pequeña modificación:

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

//Prototipos
void busqueda(char [],char [],int);

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

    char user [PATH_MAX];
    char ruta [PATH_MAX];
    int tab=0;

    strcpy(user,argv[1]); // Pillamos el nombre del usuario // NO IMPORTA SI HAY ERROR AL NO AÑADIR EL NOMBRE DEL USUARIO // SOLO ES PRUEBA	
    getcwd(ruta,PATH_MAX); // Pillamos el directorio actual.

    busqueda(user,ruta,tab);//Llamamos la funcion recursiva de busqueda de Directorios/archivos.

}
void busqueda(char user[],char ruta[],int tab){

    DIR *directorio;
    struct dirent *fichero;
    struct stat fich;
    char ficheros [PATH_MAX];
    int i;

    directorio = opendir(ruta);
    if(directorio==NULL){
        printf("Error al abrir el directorio\n");
        exit(-1);
    }
    while ( (fichero=readdir(directorio)) != NULL ){
        if ( strcmp(fichero->d_name, "..") == 0
             || strcmp(fichero->d_name, ".") == 0 )
            continue;

        strcpy (ficheros, ruta);
        strcat (ficheros, "/");
        strcat (ficheros, fichero->d_name);

        //obtenemos la informacion del archivo
        if ( (lstat(ficheros, &fich)) == -1 ){
            fprintf( stderr,
                     "\nNo se pudo obtener la informacion del fichero:\n" );
            fprintf( stderr, "\t%s\n\n", ficheros);
            continue;
        }

        for(i = 0; i < tab; i++)
            printf("\t");
        printf("%s \n",fichero->d_name);

        //-tree? xD
        //recursiva
        if(S_ISDIR(fich.st_mode))
            busqueda(user, ficheros, tab + 1);
    }
    closedir(directorio);
}
¿Mejora un poco la cosa? ¿Empeora? Quizás si pudieras mostrarnos un ejemplo de la salida que quieres, y un ejemplo de la salida que recibes en la práctica, podemos guiarnos un poco mejor :).
  #4 (permalink)  
Antiguo 11/10/2007, 02:46
 
Fecha de Ingreso: marzo-2007
Mensajes: 9
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Impresion de Directorios/Ficheros -tree

Aer , la salida q intento buscar es algo parecido a esto :

Practica 1 // Directorio
[Al ser un directorio Practica 1 , tabulo sus archivos]
[\t]Archivo1
[\t]Archivo2
[\t]Archivo3
[Si encuentro un Subdirectorio , añado otra tabulacion a las anteriores y si no hay mas , vuelvo al principio de la linea]<- esta parte no se como hacerla
etc..

Ejemplo practico:
Código:
Ampliacion operativos
    Practica 1
        p1.c
        p2.c
        p3.c
        pruebas
            pr.c
    Practica 2
        p1.c
        p2.c
..
Ampliacion programacion
     ejercicio1.c
     ejemplo
         ej1.c
     ejercicio2.c
..
Ahora mirare tu programa , aer si soluciona el problema , gracias :).

Última edición por lukas182; 11/10/2007 a las 05:49
  #5 (permalink)  
Antiguo 11/10/2007, 05:28
 
Fecha de Ingreso: marzo-2007
Mensajes: 9
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Impresion de Directorios/Ficheros -tree

@mhatter , muchas gracias , era eso exactamente lo que buscaba . He revisado el codigo y era mucho mas facil de lo que me pensaba , y yo no hacia nada mas q darle vueltas al tema. :)
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 17:59.