一种fat格式文件系统中加速打开/关闭文件的方法
技术领域
本发明涉及一种fat格式文件系统中加速打开/关闭文件的方法。
背景技术
嵌入式系统中,由于某些功能的特性以及设计思想,要求对于某些文件的打开操作具有相当高的频繁度,或是要求同时打开很多个文件,但由于系统对于这些操作的时间有一定的限制,如果超出该时间限制,则会令操作失败,因此,需要一种快速的打开文件的方法来解决这类问题。
对于一个fat(File Allocation Table,文件分配表)文件,它是由文件的目录项、fat链表以及文件内容组成。现有的fat文件系统中打开文件的方法,包括如下步骤:通过文件的目录项找到它的簇链的第一个位置,然后读取整条簇链信息(fat链表信息),最后可以根据需要找到簇链中对应的文件内容。对于这个过程,时间主要都耗在了簇链读取的过程中,尤其是当该磁盘已经被使用了相当长的一段时间,fat表中存在许多碎片,并且文件内容比较大时,读取一条簇链信息可能需要跨越十几个乃至几十个扇区。因此,对于某些操作是严重耗时的,例如,系统需要打开数目众多的文件;频繁打开文件,检验该文件是否存在;获取文件的创建时间,修改时间或是最后访问时间;获取文件大小的信息等。
现有的fat文件关闭方法,需要最后将fat链表信息逐个写入,并且同时刷新文件的目录项信息,以保证文件簇链信息的完整性。对于多数系统文件,这样的操作既多余又耗时,因为多数系统文件是用来记录一些固定的结构信息或是少量的配置信息的,这些文件的大小以及文件目录项信息是固定不变的。
发明内容
本发明的目的是提供一种fat格式文件系统中加速打开/关闭文件的方法,意在提高fat格式文件系统的文件打开、关闭的速度,从而提高操作效率。
本发明的技术方案可以通过以下的技术措施来实现,一种fat格式文件系统中加速打开/关闭文件的方法,包括以下步骤:
(1).打开文件,系统根据参数判断该文件是否需要读取fat链表信息,如果是,则系统先读取fat链表信息,再对文件进行操作,然后转入步骤(2);否则,直接对文件进行操作,然后转入步骤(3);
(2).系统根据参数判断该文件是否需要刷新目录项信息,如果是,则系统先刷新目录项信息,然后转入步骤(3);否则,直接转入步骤(3);
(3).关闭文件。
上述参数为文件打开函数中的参数,即分别定义“加速打开文件-不读取fat链表信息”、“加速关闭文件-不刷新目录项信息”为文件打开函数的两个参数,可以将上述其中一个参数预先传入到文件打开函数中,即当用户打开文件,对文件打开函数进行调入时,便传入相应参数,从而实现加速打开、关闭文件的目的。
本发明所述的步骤(1)中,系统先读取fat链表信息,再对文件进行的操作一般为读写操作;系统不读取fat链表信息,而直接对文件进行的操作一般为与文件内容无关的操作。
因此,当打开文件时,当前并不需要用到该文件的簇链信息,而仅仅是为了找到这个文件的相关信息,进行例如检验文件是否存在,获取文件的创建时间、修改时间、最后访问时间,获取文件大小,获取文件属性信息等与文件内容无关的操作,则适合采用加速打开文件的方法,即系统不读取fat链表信息,直接对文件进行操作。当以后需要使用时,再将这部分fat链表信息读取出来。
文件的目录项信息包括文件名称、文件创建时间、修改时间、最后访问时间、文件属性、文件长度等。对于某些文件,如果文件的修改时间、最后访问时间等信息是不重要的,并且文件的名称没有发生任何变化,那么关闭这个文件时,目录项信息是不需要刷新的,即适合采用本发明所述步骤2中的加速关闭文件的方法。
文件的fat链表是记录文件大小(长度)的一个链表,而文件的目录项信息中包括一个上述的文件长度的记录项,因此,文件的fat链表和目录项信息总是相互联系的,即目录项信息中记录的文件长度与fat链表中记录的文件长度必须一致。
本发明还可以作如下改进,当对文件完成读写操作后,文件大小没有发生变化,每次在关闭此类文件的时候,将不再需要刷新fat链表信息和目录项信息。因此,本发明所述的步骤(2)中,系统可以根据参数同时判断文件是否需要刷新fat链表信息和目录项信息,如果是,则系统同时刷新fat链表信息和目录项信息,然后转入步骤(3);否则,在不刷新fat链表信息和目录项信息的情况下直接转入步骤(3)。相应地,可以定义“加速关闭文件-不刷新fat链表信息和目录项信息”为文件打开函数的第三个参数,将该参数预先传入到文件打开函数中后,系统则在不刷新fat链表信息和目录项信息的情况下直接将文件关闭。
与现有技术相比,本发明的优点是:
(1).本发明的fat格式文件系统中加速打开/关闭文件的方法,对于提高操作效率有显著效果。采用本发明的方法后,打开文件时不需要读取fat链表信息,在某些操作上会节约相当可观的时间,如:频繁打开文件,检验该文件是否存在;获取文件的创建时间,修改时间或者最后访问时间等;获取文件大小的信息。同理,关闭文件时也可以相应缩短文件的操作流程,即可以不刷新fat链表信息、不刷新目录项信息而直接关闭文件,大大节约了操作时间。需要说明的是,文件打开或关闭的时间是与文件的大小成正比的,因此,如果所要操作的文件是比较大的,那么节约的时间将会是相当可观的。
(2).本发明的fat格式文件系统中加速打开/关闭文件的方法,该加速方法是可配置的,增强了使用本方法的灵活性:用户打开文件的时候,只需要配置相应的打开方式,即将相应的参数预先传入到文件打开函数中,就可以任意选择自己需要的特性:加速打开文件-不读fat链表信息、加速关闭文件-不刷新目录项信息、加速关闭文件-不刷新fat链表信息和目录项信息。以上这三种方式也可以与正常打开/关闭文件的方法混合使用。
下面为分别应用本发明与现有技术进行打开、关闭文件的对比实例,进一步说明本发明的有益效果:
实例1:打开一个大小为10M的文件,并进行检查这个文件是否存在的操作。用普通的打开方式,需要耗时为52毫秒;而使用本发明的加速打开方式,需要耗时仅为5毫秒。
实例2:用手机开机打开一个大小为100k的文件,并进行修改这个文件内容的操作,但文件大小不变。使用普通关闭文件方式,需要耗时为882毫秒;而使用本发明的加速关闭文件方式,即不刷新fat链表、不刷新目录项,需要耗时仅为356毫秒。
以上对比实例充分证明了本发明的加速打开/关闭文件的方法可以有效节省操作时间,从而提高操作效率。
附图说明
图1是本发明实施例1的流程图;
图2是本发明实施例2的流程图。
具体实施方式
实施例1
本发明的具体实施方式如图1所示,一种fat格式文件系统中加速打开/关闭文件的方法,包括以下步骤:
(1).打开文件,系统根据参数判断该文件是否需要读取fat链表信息,如果是,则系统先读取fat链表信息,再对文件进行操作,然后转入步骤(2);否则,直接对文件进行操作,然后转入步骤(3);
(2).系统根据参数判断该文件是否需要刷新目录项信息,如果是,则系统先刷新目录项信息,然后转入步骤(3);否则,直接转入步骤(3);
(3).关闭文件。
本发明的参数为文件打开函数中的参数,即分别定义“加速打开文件-不读取fat链表信息”、“加速关闭文件-不刷新目录项信息”为文件打开函数的两个参数,并将上述其中一个参数预先传入到文件打开函数中,即当用户打开文件,对文件打开函数进行调入时,便传入相应参数。因此,用户打开文件的时候,只需要配置好打开方式,就可以选择自己需要的特性,从而实现加速打开、关闭文件的目的。
本发明的步骤(1)中,系统先读取fat链表信息,再对文件进行的操作一般为读写操作;而在系统不读取fat链表信息的情况下直接对文件进行的操作一般为与文件内容无关的操作,该与文件内容无关的操作包括检验文件是否存在,获取文件的创建时间、修改时间、最后访问时间,获取文件大小、文件属性等相关信息的操作,其中,文件属性是指该文件是否是系统文件、隐藏文件、只读文件等文件类型信息。因此,当打开文件时,当前并不需要用到该文件的簇链信息,而仅仅是为了找到这个文件的相关信息,则适合采用加速打开文件的方法,即系统不读取fat链表信息,直接对文件进行操作。当以后需要使用时,再将这部分fat链表信息读取出来。
对于某些文件,如果文件的修改时间、最后访问时间等信息是不重要的,并且文件的名称没有发生任何变化,那么关闭这个文件时,目录项信息是不需要刷新的,即适合采用本发明步骤(2)中的加速关闭文件的方法。
下面列举具体实例说明:
文件打开函数的接口为:
T_PFILE File_Open(T_PFILE parent,const T_U 16*FileName,T_U32mode)
其中,parent是父目录的文件句柄,FileName是文件名,mode是指定文件将以什么方式打开,定义如下参数:
#define FILE_MODE_READ 0x00文件以只读方式打开
#define FILE_MODE_CREATE 0x01文件被创建
#define FILE_MODE_OVERLAY 0x02文件将以覆盖的方式打开
#define FILE_MODE_APPEND 0x03文件以继续追加的方式打开
如上是几种普通的打开方式,文件打开范例如下:
File_Open(null,“B:/TestFile”,FILE_MODE_READ)
这个函数说明:B盘下的文件TestFile将会以只读方式被打开。
File_Open(null,“B:/TestFile”,FILE_MODE_CREATE)
这个函数说明:B盘下将会创建一个文件TestFile。
当使用本实施例的加速打开/关闭文件的方法时,定义如下参数:
#define FILE_MODE_EXT_FAT_FIXED 0x40000000打开文件时不需要读fat链表信息
#define FILE_MODE_EXT_FDT_FIXED 0x80000000关闭文件时不需要刷新目录项信息
因此,当想要不读fat链表信息时,文件打开如下:
File_Open(null,“B:/TestFile”,FILE_MODE|READ|FILE_MODE_EXT_FAT_FIXED)
此时,这个文件的fat链表信息就不会被读出来。
如果不想刷新目录项信息时,文件打开如下:
File_Open(null,“B:/TestFile”,FILE_MODE_OVERLAY|FILE_MODE_EXT_FDT_FIXED)
此时,这个文件在关闭时,不会刷新目录项信息。
实施例2
本发明的具体实施方式如图2所示,与实施例1所不同的是,对于某些文件,如用来记录一些固定的结构信息或是少量的配置信息的系统文件。当完成读写操作后,文件大小没有发生变化,即从创建到最后,文件的大小都是固定的一个结构,那么每次在关闭此类文件的时候,不再需要刷新fat链表信息和目录项信息。例如,仅在原来文件内容的基础上进行一些修改,而文件的大小不变,则完全可以在创建之初就给其分配足够的空间信息,即足够多的簇链,那么关闭这个文件时,不需要刷新目录项信息和fat链表信息。因此,在所述的步骤(2)中,系统可以根据参数同时判断文件是否需要刷新fat链表信息和目录项信息,如果是,则系统同时刷新fat链表信息和目录项信息,然后转入步骤(3),即关闭文件;否则,在不刷新fat链表信息和目录项信息的情况下直接转入步骤(3),即直接关闭文件。相应地,定义“加速关闭文件-不刷新fat链表信息和目录项信息”为文件打开函数的第三个参数,将该参数预先传入到文件打开函数中后,系统在不刷新fat链表信息和目录项信息的情况下直接将文件关闭,大大提高了操作效率。