一种文件处理方法及系统的制作方法

文档序号:6364295阅读:104来源:国知局
专利名称:一种文件处理方法及系统的制作方法
技术领域
本发明涉及文件处理技术领域,特别是涉及一种文件处理方法及系统。
背景技术
Windows API (Application Programming Interface,应用程序编程接口)是用来控制Windows操作系统各个部件的外观和行为的预先定义的Windows函数,操作系统通过Windows API函数获知用户的操作,凡是Windows操作系统中的应用程序,都可以调用Windows API 函数。目前Windows操作系统是通过调用设置文件指针函数(SetFilePointer)对所读取的数据进行定位,再通过调用读文件函数(ReadFile)对文件进行读取。当频繁读取文件时,系统需要频繁调用SetFilePointer函数将文件指针指向待读文件的某一区域,再调用ReadFile函数读取该区域数据,每次进行数据读取时,都需要在磁盘上进行寻道操作,每次都会产生磁盘10 (输入输出),导致读取文件速度过慢。因此,亟需一种文件处理方案用以解决上述问题。

发明内容
本发明的目的在于提供一种文件处理方法及系统,用以解决数据读取时频繁产生磁盘10而导致的占用系统资源的问题。为此,本发明实施例采用如下技术方案:
本发明实施例提供一种文件处理方法,操作系统中注册有内存访问异常处理函数,该方法包括:
当接收到打开文件的请求时,申请与所请求打开的文件对应的内存区域,并且设置所述内存区域的属性为不可读写;
当接收到读取文件的请求时,访问与所请求读取的文件对应的内存区域;若内存访问失败且失败原因为所述内存区域的属性为不可读写,则通过调用和执行所述内存访问异常处理函数,从磁盘中获取所请求读取的文件数据,将获取到的文件数据存储到所述内存区域,并将所述内存区域属性设置为可读写,从所述内存区域中读取文件数据;否则,从所述内存区域中读取文件数据。本发明实施例还提供一种文件处理系统,操作系统中注册有内存访问异常处理函数,该文件读取系统包括:接收模块、第一处理模块、第二处理模块以及获取模块,其中:
接收模块,用于接收打开文件的请求,以及接收读取文件的请求;
第一处理模块,用于当所述接收模块接收到打开文件的请求时,申请与所请求打开的文件对应的内存区域,并且设置所述内存区域的属性为不可读写;
第二处理模块,用于当所述接收模块接收到读取文件的请求时,访问与所请求读取的文件对应的内存区域,若内存访问失败且失败原因为所述内存区域的属性为不可读写,则通过调用和执行所述内存访问异常处理函数,从 磁盘中获取所请求读取的文件数据,将获取到的文件数据存储到所述内存区域,并将所述内存区域属性设置为可读写,调用所述获取模块从所述内存区域中读取文件数据;否则,调用所述获取模块从所述内存区域中读取文件数据;
获取模块,用于从所述内存区域中读取文件数据。与现有技术相比,本发明的实施例具有如下优点:
本实施例通过在操作系统中注册内存访问异常处理函数,并申请与打开的文件对应的内存区域,从该内存区域中读取文件数据,若内存访问失败且失败原因为内存区域的属性为不可读写,则通过调用和执行内存访问异常处理函数,从磁盘中获取所请求读取的文件数据。本发明实施例在读取文件的同一区域数据时,只在首次读取文件数据时产生一次磁盘10,并将文件数据存储到内存区域中,若此后再去读取文件的这个区域数据,就会直接去内存区域中读取数据,不会再次产生磁盘10,节约了系统资源,提高了文件读取的效率。


图1为本发明实施例提供的文件读取方法的流程示意 图2为本发明实施例提供的调用内存访问异常处理函数到磁盘中读取文件数据的流程不意 图3为本发明实施例提供的文件读取系统的结构示意图。
具体实施例方式本发明实施例提出一种文件处理方法及系统,利用异常处理机制,将文件数据存储到内存区域中,实现文件快速读取。本发明实施例中的内存访问异常处理机制是指:预先定义内存访问异常处理函数,并将该函数预先注册在操作系统当中,当用户访问内存出现异常时,操作系统不会采用系统常规的处理方式 进行处理(例如,产生告警信息等),而是调用异常处理函数进行处理。在打开文件时,申请对应的内存区域,当要读取文件数据时,去该内存区域中读取对应的数据,如果内存数据不存在,则会产生内存访问(缺页)异常,即该文件数据是首次读取。文件处理系统调用异常处理函数,异常处理函数会调用SetFilePointer函数和ReadFile函数将文件数据存储到该内存区域中;如果内存区域中有对应的文件数据存在,说明该文件数据已经被读取过一次,则可以直接从该内存区域中读取该文件数据。下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。参见图1,为本发明实施例提供的文件处理方法的流程示意图,操作系统中注册有内存访问异常处理函数,如图所示,该方法包括以下步骤:
步骤101,当接收到打开文件的请求时,文件处理系统申请与所请求打开的文件对应的内存区域,并且设置所述内存区域的属性为不可读写。具体的,该内存区域的大小不小于所述文件大小的内存区域,优选的,该内存区域的大小与所述文件大小相等。
优选的,文件处理系统申请对应的内存区域,可以通过调用VirtualAlloc函数实现。VirtualAlloc是Windows API函数,包含在windows系统文件Kerne132.dll中,该函数的功能是调用进程的虚地址空间,预定或者提交一部分页。VirtualAlloc用于内存分配,可以通过并行多次调用提交一个区域的部分或全部,来保留一个大的内存区域。多重调用提交同一块区域不会引起失败,这使得一个应用程序保留内存后可以随意提交将被写的页。步骤102,当接收到读取文件的请求时,访问与所请求读取的文件对应的内存区域。步骤103,若内存访问失败且失败原因为所述内存区域的属性为不可读写,则执行步骤104 ;否则,执行步骤106。具体的,当用户读取文件时,文件处理系统去对应的内存区域中读取文件数据,若是首次读取文件,该内存区域的属性为初始设置的“不可读写”,则会产生内存访问异常,调用内存访问异常处理函数,执行步骤104,此时,文件存储在磁盘上,尚未被保存到该内存区域中。若用户之前曾经读取过该文件(非首次读取文件),此时,该内存区域的属性已被修改为“可读写”,不会产生内存访问异常,该文件数据已经存储在该内存区域中,则直接执行步骤 106。步骤104,文件处理系统通过调用内存访问异常处理函数,从磁盘中获取所请求读取的文件数据。内存访问异常处理函数包括:设置文件指针函数(SetFilePointer)和读文件(ReadFile)函数。调用内存访问异常处理函数到磁盘中读取文件数据,会产生磁盘10,如图2所示,该步骤包括以下子步骤:
步骤21,文件处理系统通过调用和执行SetFilePointer函数,在磁盘中定位到该文
件。·具体的,通过指针记录文件的位置,S卩,通过指针函数可以定位到该文件在磁盘的哪个扇区、磁道、簇和字节,从而准确找到该文件在磁盘中的存储位置。步骤22,文件处理系统调用和执行ReadFile函数,根据文件在磁盘中的位置读取该文件数据。具体的,当SetFilePointer函数定位到文件在磁盘中的位置后,系统会记录下来当前文件位置信息,再通过调用ReadFile函数读取该文件数据。ReadFile函数包括四个参数,分别用于指示:待读取的文件、保存所读取文件数据的缓冲区、待读取文件的长度及实际读取大小。例如,SetFilePointer函数定位文件在磁盘中的第3扇区第2磁道第2簇的第3字节,那么调用ReadFile函数读取文件时,是从第3字节开始进行读取,并把指定长度的数据放入指定的缓冲区内。优选的,读取文件的请求可以为读取局部文件数据的请求,文件处理系统通过调用和执行所述内存访问异常处理函数,从磁盘中获取的文件数据是所请求读取的局部文件数据。具体的,当接收到用户读取文件中某一区域数据的请求时(例如,仅读取文件某一页的数据),文件处理系统可以不访问全部内存区域,而是访问该文件区域数据对应的内存区域(该页文件数据对应的内存区域)。如果该文件区域数据(该页文件数据)对应的内存区域的属性为不可读写,则通过调用和执行内存访问异常处理函数(包括SetFilePointer函数和ReadFile函数),从磁盘中获取该页文件数据,将该页文件数据存储到对应的内存区域,将对应的内存区域属性设置为可读写,并从该对应的内存区域中读取该页文件数据;如果该对应的内存区域的属性为可读写,说明该页文件数据不是首次被读取,则直接从该对应的内存区域中读取该页文件数据。在ReadFile函数中可根据用户需求自行定义需要读取的部分文件数据,并将该部分文件数据存入内存区域,而无需读取并全部文件数据,避免内存区域的占用以及不必要的系统资源的浪费。步骤105,文件处理系统将文件数据存储到该对应的内存区域,并将内存区域的属性修改为可读写。当文件处理系统完成文件数据在内存区域中的存储操作之后,将内存区域的属性由初始的不可读写修改为可读写,以便在后续再次读取该文件时,可以直接从内存区域中读取文件,避免产生磁盘10。步骤106,文件处理系统从内存区域中读取文件数据。步骤107,当接收到关闭文件的请求时,文件处理系统释放与请求关闭的文件对应的内存区域。本实施例的方法及系统通过在操作系统中注册内存访问异常处理函数,并申请与打开的文件对应的内存区域,从该内存区域中读取文件数据,若内存访问失败且失败原因为内存区域的属性为不可读写,则通过调用和执行内存访问异常处理函数,从磁盘中获取所请求读取的文件数据。本发明实施例在读取文件的同一区域数据时,只在首次读取文件数据时产生一次磁盘10,并将文件数据存储到内存区域中,若此后再去读取文件的这个区域数据,就会直接去内存区域中读取数据,不会再次产生磁盘10,节约了系统资源,提高了文件读取的效率。基于相同的构思,本 发明实施例还提供一种文件处理系统,操作系统中注册有内存访问异常处理函数,如图3所示,该系统包括:接收模块31、第一处理模块32、第二处理模块33以及获取模块34,其中,
接收模块31,用于接收打开文件的请求,以及接收读取文件的请求。第一处理模块32,用于当接收模块31接收到打开文件的请求时,申请与所请求打开的文件对应的内存区域,并且设置内存区域的属性为不可读写。第二处理模块33,用于当接收模块31接收到读取文件的请求时,访问与所请求读取的文件对应的内存区域,若内存访问失败且失败原因为内存区域的属性为不可读写,则通过调用和执行内存访问异常处理函数,从磁盘中获取所请求读取的文件数据,将获取到的文件数据存储到内存区域,并将内存区域属性设置为可读写,调用获取模块从内存区域中读取文件数据;否则,调用获取模块从内存区域中读取文件数据。获取模块34,用于从内存区域中读取文件数据。具体的,内存访问异常处理函数包括设置文件指针函数和读文件函数,第二处理模块33具体用于,通过调用和执行设置文件指针函数,在磁盘中定位到该文件;通过调用和执行读文件函数,根据所述文件在磁盘中的位置读取文件数据。具体的,读取文件的请求为读取局部文件数据的请求,第二处理模块33具体用于,通过调用和执行所述内存访问异常处理函数,从磁盘中获取的文件数据是所请求读取的局部文件数据。
第一处理模块32具体用于,当接收模块31接收到打开文件的请求时,申请不小于该文件大小的内存区域,并建立该内存区域与所述文件的对应关系。该文件处理系统还包括第三处理模块35,接收模块31还用于接收关闭文件的请求;第三处理模块35用于当接收模块31接收到关闭文件的请求时,释放与请求关闭的文件对应的内存区域。本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台终 端设备(可以是手机,个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。
权利要求
1.一种文件处理方法,其特征在于,操作系统中注册有内存访问异常处理函数,该方法包括: 当接收到打开文件的请求时,申请与所请求打开的文件对应的内存区域,并且设置所述内存区域的属性为不可读写; 当接收到读取文件的请求时,访问与所请求读取的文件对应的内存区域;若内存访问失败且失败原因为所述内存区域的属性为不可读写,则通过调用和执行所述内存访问异常处理函数,从磁盘中获取所请求读取的文件数据,将获取到的文件数据存储到所述内存区域,并将所述内存区域属性设置为可读写,从所述内存区域中读取文件数据;否则,从所述内存区域中读取文件数据。
2.如权利要求1所述的方法,其特征在于,所述内存访问异常处理函数包括设置文件指针函数和读文件函数,所述通过调用和执行内存访问异常处理函数,从磁盘中获取文件数据,包括: 通过调用和执行设置文件指针函数,在磁盘中定位到所述文件; 通过调用和执行读文件函数,根据所述文件在磁盘中的位置读取文件数据。
3.如权利要求1所述的方法,其特征在于,所述读取文件的请求为读取局部文件数据的请求; 通过调用和执行所述内存访问异常处理函数,从磁盘中获取的文件数据是所请求读取的局部文件数据。
4.如权利要求1-3之一所述的方法,其特征在于,所述当接收到打开文件的请求时,申请对应的内存区域,包括:当接收到打开文件的请求时,申请不小于所述文件大小的内存区域,并建立该内存区域与所述文件的对应关系。
5.如权利要求1所述的方法,其特征在于,该方法还包括:当接收到关闭文件的请求时,释放与请求关闭的文件对应的内存区域。
6.一种文件处理系统,其特征在于,操作系统中注册有内存访问异常处理函数,该文件读取系统包括:接收模块、第一处理模块、第二处理模块以及获取模块,其中: 接收模块,用于接收打开文件的请求,以及接收读取文件的请求; 第一处理模块,用于当所述接收模块接收到打开文件的请求时,申请与所请求打开的文件对应的内存区域,并且设置所述内存区域的属性为不可读写; 第二处理模块,用于当所述接收模块接收到读取文件的请求时,访问与所请求读取的文件对应的内存区域,若内存访问失败且失败原因为所述内存区域的属性为不可读写,则通过调用和执行所述内存访问异常处理函数,从磁盘中获取所请求读取的文件数据,将获取到的文件数据存储到所述内存区域,并将所述内存区域属性设置为可读写,调用所述获取模块从所述内存区域中读取文件数据;否则,调用所述获取模块从所述内存区域中读取文件数据; 获取模块,用于从所述内存区域中读取文件数据。
7.如权利要求6所述的文件处理系统,其特征在于,所述内存访问异常处理函数包括设置文件指针函数和读文件函数; 所述第二处理模块具体用于,通过调用和执行设置文件指针函数,在磁盘中定位到所述文件;通过调用和执行读文件函数,根据所述文件在磁盘中的位置读取文件数据。
8.如权利要求6所述的文件处理系统,其特征在于,所述读取文件的请求为读取局部文件数据的请求; 所述第二处理模块具体用于,通过调用和执行所述内存访问异常处理函数,从磁盘中获取的文件数据是所请求读取的局部文件数据。
9.如权利要求6-8之一所述的文件处理系统,其特征在于,所述第一处理模块具体用于,当所述接收模块接收到打开文件的请求时,申请不小于所述文件大小的内存区域,并建立该内存区域与所述文件的对应关系。
10.如权利要求6所述的文件处理系统,其特征在于,该系统还包括第三处理模块; 所述接收模块,还用于接收关闭文件的请求; 所述第三处理模块,用于当所述接收模块接收到关闭文件的请求时,释放与请求关闭的文件对应的内存区域。 ·
全文摘要
本发明公开了一种文件处理方法及系统,操作系统中注册有内存访问异常处理函数,该方法包括当接收到打开文件的请求时,申请与所请求打开的文件对应的内存区域,并且设置内存区域的属性为不可读写;当接收到读取文件的请求时,访问与所请求读取的文件对应的内存区域;若内存访问失败且失败原因为内存区域的属性为不可读写,则通过调用和执行内存访问异常处理函数,从磁盘中获取所请求读取的文件数据,将获取到的文件数据存储到内存区域,并将内存区域属性设置为可读写,从内存区域中读取文件数据;否则,从内存区域中读取文件数据。
文档编号G06F12/08GK103246611SQ20121002589
公开日2013年8月14日 申请日期2012年2月7日 优先权日2012年2月7日
发明者陈卓, 白子潘 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1