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