掌叔
2008-06-06 16:05:41
摘自:chenyi1976.spaces.live.com
翻译:陈轶
概览
首先,什么是文件系统?为什么你需要它?
好吧,文件系统没什么东西,它提供了另外向你的ROM增加文件的新方法。你现在已经知道了一种基本的简单的方法:编译期增加文件。。。。(译:这一点不会翻译了。。。略过。)实际上,还有另外一种方法,编译后增加文件。是的,这是可能的,而且有不小的便利:
* 你能够突破4M空间的限制,因为这些文件并不存储在RAM中,而是在gba闪存卡的ROM中。。。。这同时也意味着这些文件只有在你使用gba闪存卡的时候才正常工作,而且不能在WMB和CF上工作(尽管我做了一个可以在上面正常工作的版本,但是有4MB大小的限制)(译:谁能告诉我gba闪存是什么?WMB和CF是什么?只能拿乔布斯的话安慰自己了:StayHungry,StayFoolish)
* 因为你可以在编译后加入文件,这意味着最终用户可以加入文件。。。很多应用都会用到这个功能,举例来说,音乐播放器,图像浏览器。。。nDoS(译:nDoS应该是个使用PAlib开发出来的程序)使用文件系统来存储和读取OutLook/ThunderBird的通讯录。。。。我甚至在我现在的工程中使用文件系统来增加皮肤功能。你看到了,文件系统功能给予了最终用户定制你的软件的机会。
凡事都有坏处。。。
* 不能工作于WMB和其他(前面提到过了,有4MB的限制)
* 它的函数用起来真的比较痛苦,虽然我已经尽力简化他们了。
PAlib的文件系统被称为PAFS。。。。你也可以使用GBFS,这是PAlib早期版本中带的文件系统功能,目前的版本为了前向兼容还保留着。
需要的文件
好的,准备好了。。。开始!如你所猜,你需要一些文件让文件系统跑起来。。。我们看一下PAFS/PAFS这个例子,这是最简单的。。。打开目录,你就会看到你需要的文件。。。
*
PAFS.exe 是主文件。他的作用是将需要的文件加入你的ROM中,所以你需要他。。。
*
PAFS.log 是主文件生成的日志,记录生成过程中一些情况和数据...
*
PAFS.bat 是个重要的文件。用写字板打开这个文件,你会看到它包含了PAFS PAFS.ds.gba. 这些是什么?
o
PAFS是可执行文件,实际上就是指PAFS.exe...
o
PAFS.ds.gba 是指你的ROM,运行期可以动态加入文件的那个。。。你也可以命名为.nds文件。
o
在这些的后面,你可以加入更多的参数,比如你文件存放的目录。如果你没有给定目录名称(就像这个例子一样),它将使用File/目录下的所有文件。
现在,你看到了Files目录了吗?在里面有很多文件文件。他们没有什么用,只是用来检查增加文件是否正常工作。如果正常,你应该能够在你的DS上看到这些文件(就像文本阅览器)。我们看看代码吧!
你同样可以在PAlibTools目录下发现一个PAFS.exe和.bat文件。
简单文件加载
在同一个例子里面,打开模板。。。这里是主函数里面应该包含的代码(除了经典的初始化函数以外)
PA_InitText(0, 0); // Initialise the text system on the bottom screen
PA_InitText(1, 0); // Initialise the text system on the top screen
PA_OutputText(1, 0, 0, "Loading PAFS...");
u32 FileNumber = PA_FSInit(); // Inits PA File System, and returns the number of files
PA_OutputText(1, 0, 1, " Files : %d ", FileNumber);
// For each file, we'll draw it's name on the bottom screen...
s32 i;
for (i = 0; i < FileNumber; i++){
PA_OutputText(0, 0, i, "%s.%s Size : %d, %d", PA_FSFile[i].Name, PA_FSFile[i].Ext, PA_FSFile[i].Length, PA_FSFile[i].FilePos);
}
// Output the first file text on the top screen, just to test...
PA_OutputText(1, 0, 5, "File 0 : %s", PA_PAFSFile(0));
PA_OutputText(1, 0, 7, "File 1 : %s", PA_PAFSFile(1));
PA_OutputText(1, 0, 9, "File 2 : %s", PA_PAFSFile(2));
// Infinite loop to keep the program running
while (1)
{
PA_WaitForVBL();
}
我们以2个文件初始化函数作为开始,每个屏幕一个,以及一个非常傻瓜的装载PAFS。。。。文本。。。。我不再细说了。
让我们看看重要的部分:
*
u32 FileNumber = PA_FSInit(); PA_FSInit 是初始化文件系统的函数。如果你不调用它,你就不能读任何文件。。。如果需要文件的信息,你只要遍历一遍所有的文件。。。 这个函数返回了文件的个数,我把它存在FileNumber这个变量里面。
然后是PA_OutputText(1, 0, 1, " Files : %d ", FileNumber);用文本显示文件的个数。
下面是有趣的部分:
s32 i;
for (i = 0; i < FileNumber; i++){
PA_OutputText(0, 0, i, "%s.%s Size : %d, %d", PA_FSFile[i].Name, PA_FSFile[i].Ext, PA_FSFile[i].Length, PA_FSFile[i].FilePos);
}
这些代码起什么作用呢?对每个文件(按照文件顺序,0号文件,1号。。。),显示出文件的名称,文件名后缀,文件长度,文件在文件系统中的位置。你不会使用最后2个信息,但是文件名称和后缀是非常有用的。
* 名称,这样你才能允许用户指定装载哪个文件。。。
* 扩展名,这样你就能知道文件是什么类型。。。
就像你看到的那样,获取这些信息非常简单。他们被包含在PA_FSFile结构数组里面。PA_FSFile[n]是第n个文件(注意:编号是从0开始,不是从1),.Name, .Ext, .Length, .FilePos是这个结构的值。
你看到的最后一件事情是PA_OutputText(1, 0, 5, "File 0 : %s", PA_PAFSFile(0));. 非常重要的东西,张大你的眼睛!(译:我觉得这个作者是不是老师出身?)
*
PA_PAFSFile(File Number) 是指向真正文件的指针,参数Number是文件的编号。做关于这个文件的任何操作,我们都要使用这个指针。。。它就像文件名称一样唯一标示了这个文件,在PAFS中你就得学会用这个。。。
这个例子里,我们使用在文本命令里面使用指针。。。为什么?很简单因为我们增加的这些文件是文本文件,所以我们能够把文本显示在屏幕上。。。如果你试图显示其他类型(比如音乐文件)的文件到屏幕上,你将看到一屏幕的天书。。。
好了,现在我们看过了代码,你编译下。。。在把你的ROM放到你的闪存卡之前,别忘了加入文件!要做到这个,运行一下PAFS.bat,它会把所有Files目录下的文件搞到你的ROM里面。烧录,测试,你现在可以在你的DS屏幕上看到你的文本啦!(译:看起来实现读书功能实在太简单了,比我原来设想的要简单很多)
哈哈,程序已经完成了!但是教程还没有结束。还有很多东西值得一看,比如说读取目录结构(是的,PAFS支持目录!)或者在WMB和CF卡上使用PAFS。。。。还有一些例子演示了如果从文件装载图片和音乐,你可以在对应的目录下找到这些例子。
(译:待续)