PSP 开发/文件系统/迭代目录
外观
迭代目录是加载音乐播放器、视频播放器和图片查看器等文件夹数据的核心,它们依赖于搜索目录来列出可播放的文件。递归可以与迭代一起使用,以查看给定目录中的所有文件,甚至包括根目录。文件迭代是一种类似的方法,它包含一个 SceIoStat 结构体,用于打开和修改文件。
必须打开目录才能查看其内容。PSPDEV 提供 sceIoDopen(),而不是用于文件的 sceIoOpen()。但是,从调用中返回了文件句柄,并接受 const char*。如果数字小于或等于 0,则必须存在错误。
const char* src = ROOT;
int uid = sceIoDopen(src);
打开的目录,与文件一样,必须关闭。可以打开多个目录,但是,除非使用递归,否则建议不要同时打开多个目录。还建议不要在程序开始时打开它们,并在程序结束之前一直保持打开状态。PSP 是一款功能强大的机器,但是诸如内存泄漏,尤其是使用缓冲区的 IO 中的内存泄漏之类的糟糕做法,会积聚成内存浪费、代码难以管理和功能低下。可以使用 SceIoDclose() 函数关闭目录。它返回一个整数,表示是否存在故障,应进行处理。
int status = sceIoDclose(uid);
目录中包含文件。SceIoDirent 结构体代表“目录条目”,其中包含有关目录的信息。为了将信息加载到此结构体中,需要调用 sceIoDread() 函数。这一次只能获取一个文件。这意味着 sceIODread() 函数将从目录中加载一个文件的数据到结构体中。可以使用 while 循环遍历所有文件。还有一个 SceIoStat,它告诉文件夹的大小和时间属性。由于 SceIoDirent 中的文件名没有关联的路径,因此可以使用
void get_files() {
const char* src = ROOT;
// open the directory
int uid = sceIoDopen(src);
if(uid <= 0)
crash(uid, "Directory Iteration", "Failure or empty directory");
printf("Opened, reading directory.\n");
// iterate over the directory for files, print name and size of array (always 256)
// this means you use strlen() to get length of file name
SceIoDirent dir;
char temp_name[PATH_MAX]; // 4096 is linux's forced policy
while(sceIoDread(uid, &dir) > 0) {
printf("Read `%s` (%d) \n", dir.d_name, sizeof(dir.d_name));
// format a path, print it (remember to include stdio.h)
snprintf(temp_name, PATH_MAX, "%s%s", src, dir.d_name);
printf("@%s\n", temp_name);
}
printf("Done reading directory.\n");
// clean up
sceIoDclose(uid);
}