[Multi] Como crear ventana para explorar archivos??

Hola, me gustaria tener la tipica ventanita que te permite selecionar un archivo para abrirlo.
Se podria hacer para PC y PSP?
Estoy usando SDL en el programa que estoy haciendo, pero en esta libreria no encuentro la solucion.
Muchas gracias
por el momento lo único que he visto para psp que te permita hacer lo que dices es el lte... así que creo que lo tendrás dificil.

siempre lo puedes hacer tu o implementar un pequeño navegador usando framebuffer o las propias herramientas de sdl.
Al final estoy haciendo con SDL una caja de texto donde escribo el nombre del archivo que hay que abrir/guardar, lo malo es que no puedes ver que archivos hay para abrir.
Es muy facil listar directorios.

Antes de nada, tengo que decirte que yo no programo para PSP y lo que estoy viendo, es el modulo DevkitPro para PSP, asi que podria haber ligeras variaciones si estas usando otras librerias.


Lo que necesitas, son unas funciones de nombre opendir(), readdir() y closedir(), que se localizan en el fichero dirent.h

¿como funcionan?

Pues lo primero que tienes que hacer, es abrir un directorio usando la funcion opendir y la ruta del directorio que queremos listar y esta funcion nos devolvera un puntero identificador de tipo DIR (estructura) o NULL si no se pudo abrir.


Luego hay que crear un array de estructura de tipo dirent, y una estructura puntero, para recibir el valor devuelto por readdir

Esta funcion devolvera un puntero a una estructura dirent interna (que podemos copiar con un memcpy a nuestro array, para luego tratarlo o mejor aun, anteponiendo el * para que se copie la estructura interna sobre el elemento del array ) o un NULL, que indicará que hemos alcanzado el final. La funcion recibe como argumento el puntero DIR que nos devolvio
opendir , por cierto.

Una vez alcanzado el final (o el numero maximo admitido por nuestro array dirent , procedemos a cerrar con closedir


Vale, ahora pasemos a analizar los elementos de la estructura dirent para saber lo que se nos ha devuelto.


d_stat -> esto es una estructura SceIoStat con los siguientes campos utiles:


st_attr-> atributos de la entrada, un flag con FIO_SO_IFDIR,

indicara que la entrada es un directorio, mientras que un flag con FIO_SO_IFREG indicara que se trata de un fichero. Puesto que se tratan de flag de estado , hay que recurrir a hacer un AND logico, ya que podria haber otros flags (de permisos) activos.

Tambien hay unas macros definidas para hacer la pregunta directamente, pasandole el valor de este campo: FIO_SO_ISREG(m), para ficheros y FIO_SO_ISDIR(m) para directorios, que devolveran un valor distinto a 0 en caso afirmativo.


st_size -> aqui podremos conocer la longitud del fichero


Hay otros campos relacionados con los permisos de acceso y con la hora y fecha de creacion del fichero, etc, pero creo que eso excede de lo que necesitas y en todo caso, ya lo averiguaras por tu cuenta.

Bien, aparte del elemento d_stat, en una estructura dirent existe otro dato util: el nombre del fichero o directorio que se almacena en el campo d_name


Con esta informacion, deberias ser capaz ya de hacer lo que te proponias: poder listar un directorio y seleccionar un fichero o incluso, entrar en nuevos directorios y proceder a listarlos.

Espero haberte sido util ;)
joer que wena explicación hermes! muy bien ( y eso que no eres de psp ). La verdad que es clavadito casi a cuando estudíe el listar directorios en linux en la uni por suerte no tengo que gastar cosas de estas de momento...:)
muchas gracias, tomo nota [rtfm] [rtfm] [rtfm]
La verdad es que con eso ya puedo hacerlo, aunque currarme un interface grafico como el de windows me va a costar mucho tiempo con esas funciones, si tengo tiempo lo implemento, y si no me replanteare como hacerlo...
porque no haces algo como lo que tienen hecho en el emulador de gba ( no me acuerdo el nombre xD ) tenian la lista de texto que representaba el fichero y en color diferente el seleccionado y subiendo bajando se movia el seleccionado es mucho más fácil que poner una ventanita de hecho lo tienes casi hecho solo tienes que mostrar texto...

UNA IDEA: puedes tener un vector con todos los nombres de ficheros de un directorio y con un índice apuntas a donde estas actualmente ( lo que estas mostrando ) y otro para ver el fichero seleccionado, si el fichero seleccionado es el último que cabe en pantalla le sumas 1 al trozo de vector que muestras. Si lo haces así usa la clase vector y si puedes string en vez de char ** ya que un menu no precisa velocidad punta y es mucho mas comodo y menos errores.
Para aplicaciones futuras lo hare, lo que pasa es que si hago eso para psp lo tengo tambien que implementar en win32 y linux, y solo de pensar en tantro trabajo me da algo [tomaaa] [tomaaa] [tomaaa] [tomaaa]

edito: habia puesto "Para aplicaciones futuras no hare" y es "Para aplicaciones futuras lo hare" que puede dar a error
Hola!, Ayer no pude pasarme, pero ya veo que os ha gustado mi forma de explicarlo ;)
8 respuestas