PDA

Ver la versión completa : Búsqueda de ficheros



Arcnor
20/03/2006, 22:09
Buenas.

Aún no tengo mi GP2X (¡espero que mañana esté aquí! Aunque a correos tengo que ir al día siguiente de la llegada, ¡encima! :cagonto:)

Pero aún así, estoy haciendo un pequeño proyecto primero para PC, que luego portaré a la negrita en cuanto la tenga (ya se enterarán cuando lo haga, estoy seguro :D) pero necesito un poco de ayuda. Para obtener un listado de ficheros me gustaría saber que opciones tengo disponibles. En mi proyecto he estado usando _findfirst y _findnext (no con muy buenos resultados, la verdad) que creo que son las que usan la minimal lib de Ryleh (io.h). Si estas son las únicas opciones, pues nada. Si no, pues que alguien me ilumine un poco, por favor :D

Otra preguntita aprovechando el post, por si no hay más opción que usar _findfirst... Necesito hacer una búsqueda de varios archivos con extensiones diferentes, así que el patrón de búsqueda que he usado en el _findfirst es "*.x;*.y", pero no encuentra nada. Mirando la documentación, dice que se puede usar un patrón que acepte el sistema operativo sobre el que se ejecuta. Y el intérprete de comandos del Windows (porque ya no es DOS :rolleyes:) soporta la separación de wildcards con ";".

¿Algún alma caritativa tiene alguna respuesta? :D

P.D. Siento la longitud del post, SIEMPRE me lío muchísimo, véanse mis post anteriores [wei5]

Uncanny
21/03/2006, 00:19
Eso de _findfirst y _findnext huele a Micro$oft, concretamente a su io.h de la librería de su MS Visual C++ de hecho creo que en el archivo de cabecera dir.h (no ANSI) que se usaba para programar en DOS hay dos funciones iguales para lo mismo, vamos, que de estandar (como ANSI) tienen poco (me recuerda a Borland, con su Turbo C++ y ese conio.h tan especial para usar con graphic.h y sus funciones BGI :p) y no deben ser portables a otros sistemas, por lo que dudo que en la Minimal Lib se use.

En Windows y MS VC creo que se usa más que nada y actualmente sus equivalentes FindFirstFile y FindNextFile pero si vas a programar para la GP2X y ya que se usa Linux, tienes funciones POSIX (pero no ANSI) como opendir() (http://www.opengroup.org/onlinepubs/009695399/functions/opendir.html) para abrir un directorio y leer el contenido con readdir() (http://www.opengroup.org/onlinepubs/009695399/functions/readdir.html) y para cerrarlo con closedir() (http://www.opengroup.org/onlinepubs/009695399/functions/closedir.html) las tres de dirent.h pero estas no saben lo que son los "wildcards", no les culpo a mi siempre me ha sonado rara esa palabreja (aunque caracteres comodin también suena raro xD), pero fnmatch() (http://www.opengroup.org/onlinepubs/009695399/functions/fnmatch.html) de fnmatch.h se puede encargar de la tarea de filtrar basandose en un patrón/pattern para que solo se filtre los archivos con usando wildcards, por ejemplo *.png para que solo obtenga el listado de imagenes PNG, tienes un ejemplo bastante completo de como usar estas funciones POSIX en conjunto aquí (http://www.codecomments.com/archive286-2004-10-307281.html) y una info un poco más clara del uso de estas funciones en esta referencia de la librería estandar de C aquí (http://www.delorie.com/djgpp/doc/libc/libc.html).

Arcnor
21/03/2006, 00:25
Eso de _findfirst y _findnext huele a Micro$oft, concretamente a su io.h de la librería de su MS Visual C++ de hecho creo que en el archivo de cabecera dir.h (no ANSI) que se usaba para programar en DOS hay dos funciones iguales para lo mismo, vamos, que de estandar (como ANSI) tienen poco (me recuerda a Borland, con su Turbo C++ y ese conio.h tan especial para usar con graphic.h y sus funciones BGI :p) y no deben ser portables a otros sistemas, por lo que dudo que en la Minimal Lib se use.

Claro que huele a Microfos. Si lees mi post bien, verás que puse que pertenecían a la io.h esa que has nombrado ;). Y digo que las usa la Minimal de Ryleh porque en el código de algún emulador he visto en el minimal.h usar io.h y estructuras de datos como WIN32_FILE_DATA (o algo muy parecido) que es la que se usa en el Ventanucos. No me gusta nada ese sistema, por eso preguntaba por aquí :D


En Windows y MS VC creo que se usa más que nada y actualmente sus equivalentes FindFirstFile y FindNextFile pero si vas a programar para la GP2X y ya que se usa Linux, tienes funciones POSIX (pero no ANSI) como opendir() (http://www.opengroup.org/onlinepubs/009695399/functions/opendir.html) para abrir un directorio y leer el contenido con readdir() (http://www.opengroup.org/onlinepubs/009695399/functions/readdir.html) y para cerrarlo con closedir() (http://www.opengroup.org/onlinepubs/009695399/functions/closedir.html) las tres de dirent.h pero estas no saben lo que son los "wildcards", no les culpo a mi siempre me ha sonado rara esa palabreja (aunque caracteres comodin también suena raro xD), pero fnmatch() (http://www.opengroup.org/onlinepubs/009695399/functions/fnmatch.html) de fnmatch.h se puede encargar de la tarea de filtrar basandose en un patrón/pattern para que solo se filtre los archivos con determinadas con wildcards, por ejemplo *.png para que solo obtenga el listado de imagenes PNG, tienes un ejemplo bastante completo de como usar estas funciones POSIX en conjunto aquí (http://www.codecomments.com/archive286-2004-10-307281.html) y una info un poco más clara del uso de estas funciones en esta referencia de la librería estandar de C aquí (http://www.delorie.com/djgpp/doc/libc/libc.html).

Eeeeeso mismo buscaba yo, amigo Uncanny :). Las estándar, que pa' algo están. No me gusta nada usar las _findX, que ya dije lo mal que me fue. Es que con C/C++ soy relativamente nuevo (2 añitos), y ciertas cosas que no he hecho me lían (esta es una de esas cosas. En mis juegos nunca he tenido que hacer listado de ficheros :D, y cuando voy a hacer algún programita cmo el que me traigo entre manos, uso Delphi ;))

Bueno, voy a estudiarme un poco ese estándar POSIX, que siempre me ha sonado a chino y nunca le he puesto interés en aprenderlo. ¡Allá voy, amigo Google!

Gracias de nuevo, maestro

Uncanny
21/03/2006, 00:51
Lo de estandar POSIX es por las funciones que usan en un sistema que cumplen este estandar, como UNIX o algún "like UNIX" libre como los basados en el kernel Linux y software de GNU, de ahí que te diga que son funciones POSIX, en las webs que te he dado tienes la referencia de estas funciones y si usas Linux el comando man te da la info directa de las funciones y algún ejemplo.

Practicamente lo que sabes de C y C++, siempre que sea ANSI te vale para programar casi cualquier cosa que se te ocurra (y más si usas librerías portables como SDL), incluida la GP2X, y solo si te interesa la programación de sistemas sobre Linux, por ejemplo para hacerte una librería de "bajo nivel" te puede servir libros como Advanced Linux Programming (http://www.advancedlinuxprogramming.com/) que se puede descargar incluido el código fuente que se usa en el libro como ejemplos.

Arcnor
21/03/2006, 01:07
Ya, ya... Había entendido lo de POSIX ;) Y muchas gracias por la referencia, he logrado lo que quería en un ratito :)

Sé que con el C/C++ puedo programar para casi cualquier cosa. En el trabajo uso Linux y Windows, en ambos programo en C/C++ (con la MinGW32 en Windows, para que todo sea portable. Uso el mismo código en ambas plataformas :D). He hecho algunos proyectitos para PocketPC, Palm (I love Tungsten E :D). GCC es la caña [wei5]

Ahora toy liado con la SDL, haciendo la parte pa' mostrar, una pequeña lib pa' fuentes (ya se que están SFont, BFont y demás, pero me hacía ilu hacer la mía propia, además de que espero que sea más rápida). Si lo tengo listo, dentro de un ratito te enseño los progresos.

Muchas gracias de nuevo, amigo Uncanny ;)

miq01
21/03/2006, 06:59
Hola Arcnor. Aunque llego tarde te paso un ejemplo que almacena en un vector de STL los ficheros que hay en un directorio. Quizá te sea útil.


struct dirent **list;
int n=scandir("themes", &list, NULL, alphasort);

for (Uint8 i=0; i<n; i++)
{
if ((strcmp(list[i]->d_name, ".")!=0) && (strcmp(list[i]->d_name, "..")!=0))
{
mThemeNames.push_back(new char[strlen(list[i]->d_name)+1]);
strcpy(mThemeNames[numThemes], list[i]->d_name);
numThemes++;
}
free(list[i]);
}

Para que funcione, al principio del fichero tendrás que añadir:

extern int alphasort();
#include <dirent.h>
La funcion alphasort() está implementada en dirent o en alguno de sus includes, y lo que hace es ordenar la lista de ficheros alfabéticamente.

Y el vector lo tengo definido como

vector<char*> mThemeNames;

Si no usas SDL, cambia los Uint8 por int y listos.

Arcnor
21/03/2006, 20:48
Muchas gracias miq01. De momento tengo algo parecido (también almaceno en una lista) usando nada más que la dirent.h y el opendir() y readdir(). Lo del alphasort() está bien, así no me tengo que inventar ningún método de ordenación, como siempre (he repetido en tantos programas y/o lenguajes el QuickSort que ya lo pongo tras el primer begin / main() / etc :D

Gracias de nuevo ;)