¿Como saber que hay en una carpeta? (programando en C)

Consulte acerca de programas, técnicas, algoritmos etc.

¿Como saber que hay en una carpeta? (programando en C)

Notapor lacabra25 » Jue Ago 07, 2008 12:03 am

Hola, pues basicamente el titulo del tema lo dice todo, quisiera saber desde un programa que estoi haciendo en C que archivos, pero sobretodo que carpetas, hay dentro de una carpeta. Esto lo necesito para un videojuego que estoi haciendo en el que necesito saber los nombres de las carpetas que hay dentro de una carpeta, la carpeta en la que estaran las demas sera una carpeta especifica para los aspectos del juego (como los skin o mascaras de un reproductor de musica, diferentes aspectos que pueda tener el juego), y cada carpeta dentro de esta carpeta de aspectos seria un aspecto diferente que podria tener el juego, por lo que necesito saber las carpetas que hay (pues puede haber distintas carpetas que las que yo prepare al hacer el juego) para asi poder acceder a las imagenes dentro de dicha carpeta y a un archivo de texto con el nombre del aspecto para mostrarselo al jugador en las opciones del juego para que elija el que prefiera.

Espero no haberme liado demasiado y haberme podido explicar bien.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor hugoruscitti » Jue Ago 07, 2008 7:41 pm

Saludos, para recorrer un directorio puedes usar la función "scandir". Esto
devuelve una lista de todos los elementos de un directorios. Luego, para
saber que elementos son directorios puedes usar la función "lstat" en
conjunto con las macros S_ISDIR o S_ISREG... en el sistema GNU/Linux puedes
ejecutar "man lstat" o "man scandir" para conocer mas acerca de estas
funciones.

Te dejo un programa de ejemplo que imprime todos los elementos de un
directorio y distingue entre directorios y archivos regulares (o enlaces):

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


int main(void)
{
    char * nombre_de_archivo;
    struct dirent ** archivos;
    struct stat info_archivo;
    int cantidad_archivos;
    int i=0;

    cantidad_archivos = scandir(".", &archivos, NULL, NULL);

    for (i=0; i<cantidad_archivos; i++)
    {
        nombre_de_archivo = archivos[i]->d_name;

        lstat(nombre_de_archivo, &info_archivo);

        if (S_ISDIR(info_archivo.st_mode))
            printf("Directorio: %s\n", nombre_de_archivo);
        else
            printf("Archivo o enlace: %s\n", nombre_de_archivo);
    }

    return 0;
}


y un ejemplo de lo que muestra en pantalla:

Código: Seleccionar todo
$ ./test
Directorio: Imágenes
Archivo o enlace: run_bg.png
Archivo o enlace: run2.png
[...]


Saludos.

PD: el juego pocket volleyball en la página tenía una rutina para cargar
personajes similar a lo que quieres realizar, tal vez te sea útil
ver como está hecho.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor lacabra25 » Jue Ago 07, 2008 9:34 pm

Gracias, pero antes de ponerme a intentarlo quisiera hacerte algunas preguntas mas sobre la portabilidad, siento no haberlo preguntado desde un principio pues se me paso, ¿las librerias necesarias para esto son estandar, de forma que pueda compilar el codigo en cualquier sistema sin modificarlo o con modificaciones muy minimas, o solo me funcionaria en windows o linux dependiendo del codigo?, ¿el codigo podra ser compilado con cualquier compilador de C en cualquier sistema o debera cumplir algun requerimiento previo como tener instalada alguna libreria o algo asi?, ¿tendria que hacer dos versiones con distinto codigo dependiendo del sistema operativo para poder compilarlo para distintos sistemas?

Estas dudas sobre portabilidad es algo que quisiera solucionar antes de ponerme a escribir codigo pues intento que todo lo que programe sea portable, no me gusta diseñarlo en especial para un solo sistema, por ello solo programo con librerias estandar como stdio y SDL.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor hugoruscitti » Sab Ago 09, 2008 6:11 pm

La mayor parte del código es portable, solo que las estructuras
para acceder al listado de archivo (dirent) son de la norma POSIX, y
aparentemente no está disponible en Windows. Tendrías que probar...

igualemente en la siguiente página hay una descripción completa
del módulo "direct" e incluso una versión de esta biblioteca para
windows (ver pie de la página):

http://en.wikipedia.org/wiki/Dirent.h
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor lacabra25 » Sab Sep 06, 2008 9:17 am

En la funcion scandir, ¿para que son los dos NULL del final?

El problema ese de las estructuras que debo usar junto con la funcion scandir, solo lo da en windows, por lo que si el codigo despues lo quiero compilar en linux, ¿tal cual lo tengo en windows lo podria compilar en linux?, o deberia quitar el include de la libreria que me descargue del enlace que pusistes por como en linux no hace falta
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor hugoruscitti » Sab Sep 06, 2008 10:39 pm

lacabra25 escribió:En la funcion scandir, ¿para que son los dos NULL del final?


El último sirve para ordenar el resultado de archivos y el anterior
se utiliza como filtro, o criterio de selección. Recuerda leer la
página de manual si tienes problemas con ello:

http://manpages.courier-mta.org/htmlman3/scandir.3.html

este mismo manual se puede leer directamente desde GNU-Linux
escribiendo "man scandir" en un terminal.

lacabra25 escribió:El problema ese de las estructuras que debo usar junto con la funcion scandir, solo lo da en windows, por lo que si el codigo despues lo quiero compilar en linux, ¿tal cual lo tengo en windows lo podria compilar en linux?, o deberia quitar el include de la libreria que me descargue del enlace que pusistes por como en linux no hace falta


Claro, en GNU-Linux no hace falta usar ese módulo que tienes
que descargar por separado en windows... y si, tendrías que
cambiar esa linea para compilar sin problemas en ambos sistemas
el mismo código. O bien, usar una directiva del compilador
para distinguir qué parte de código se usa en cada sistema
operativo. Por ejemplo, el siguiente código compilaría en ambos
sistemas, pero en windows saluda de una forma y en GNU-Linux
de otra:

Código: Seleccionar todo
#ifdef WIN32
printf("Hola usuarios de Windows \n");
#else
printf("Hola usuarios de GNU/Linux y otros sistemas. \n");
#endif


Igualmente, no te compliques mucho con esto, ya tendrás tiempo
para ver estos detalles comparando como funciona en cada
sistema... hacer programas completamente multiplataforma en
C está lleno de detalles, y hacerlo ahora solo que quitará
tiempo valioso. Avanza con el juego y luego podrás ver estos
detalles con mas seguridad...
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

pregunta

Notapor betelu » Mié Ago 12, 2009 8:27 pm

La funcion de la q hablan scandir()
Es para windows o para linux?
de ser para linux ...saben de alguna equivalente para windows?
muchas gracias
betelu
 
Mensajes: 2
Registrado: Mié Ago 12, 2009 8:23 pm

Notapor hugoruscitti » Mié Ago 12, 2009 8:43 pm

Si, aparentemente es solo para sistemas compatibles
con los estándares POSIX.

Por lo que veo en wikipedia, hay una implementación de estas
mismas bibliotecas para windows:

http://en.wikipedia.org/wiki/Dirent.h

(mira en la parte inferior de la página, donde dice "References",
el primer vinculo te lleva a la descarga de la biblioteca para windows.)
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

no esta

Notapor betelu » Jue Ago 13, 2009 2:15 am

gracias por responderme ...
lo q pasa por lo q estuve viendo la funcion scandir no esta en esa libreria
asi q por lo tanto cuando la ejecute en mi codigo no funciono...
por lo tanto la seguire buscando
gracias d todos modos
betelu
 
Mensajes: 2
Registrado: Mié Ago 12, 2009 8:23 pm


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron