跳转到内容

PSP 开发/文件系统/迭代目录

75% developed
来自维基教科书,开放书籍,开放世界

迭代目录是加载音乐播放器、视频播放器和图片查看器等文件夹数据的核心,它们依赖于搜索目录来列出可播放的文件。递归可以与迭代一起使用,以查看给定目录中的所有文件,甚至包括根目录。文件迭代是一种类似的方法,它包含一个 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 中的文件名没有关联的路径,因此可以使用 中的 snprintf() 格式化字符串 - 此外还可以使用 sceIoOpen() 打开另一个文件。

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);
}


华夏公益教科书