2024年6月11日发(作者:)

(19)中华人民共和国国家知识产权局

(12)发明专利说明书

(21)申请号 CN2.3

(22)申请日 2003.10.13

(71)申请人 英业达股份有限公司

地址 台湾省台北市

(72)发明人 刘文涵 宋建福 蒋炜

(74)专利代理机构 隆天国际知识产权代理有限公司

代理人 潘培坤

(51)

G06F9/318

权利要求说明书 说明书 幅图

(10)申请公布号 CN 1607498 A

(43)申请公布日 2005.04.20

(54)发明名称

应用程序中存取文件数据的方法

(57)摘要

一种应用程序中存取文件数据的方

法,首先在内存中创建一储存有文件数据

修改量的记录,根据该修改记录,将从该

文件中读取的数据修改为当前数据,然后

将该当前数据进行程序处理以生成结果数

据,将该结果数据储存于该内存记录以生

成一新的修改记录,最后根据该修改记录

对文件内容进行更新并储存,本发明使用

内存记录的方式来储存文件的改变量,从

而大大减少了文件处理所需要的时间。

法律状态

法律状态公告日

法律状态信息

法律状态

权 利 要 求 说 明 书

1、一种应用程序中存取文件数据的方法,其特征在于,其通过在内存中记录文件

数据修改量的方式以提高程序运行中大文件的写入效率,该方法包括:

在内存中创建储存有文件数据修改量的记录;

根据该修改记录,将从该文件中读取的数据修改为当前数据;

将该当前数据进行程序化处理以生成结果数据;

将该结果数据储存于该内存记录以生成新的修改记录;及

根据该修改记录对文件内容进行更新并储存。

2、如权利要求1所述的应用程序中存取文件数据的方法,其特征在于,该修改记

录包括数据起始位置、数据原始长度、数据结果长度、数据指针以及数据内容的记

录。

3、如权利要求1所述的应用程序中存取文件数据的方法,其特征在于,该根据修

改记录将从文件中读取的数据修改为当前数据的步骤,还包括如下步骤:

打开文件取得文件句柄;

将文件指针定位至要读入数据的位置;

读取一段数据,并与修改记录相参照;及

用修改记录中相同位置的数据取代读入的数据。

4、如权利要求3所述的应用程序中存取文件数据的方法,其特征在于,该读取一

段数据,并与修改记录相参照的步骤,是每读取一次数据都要与修改记录相对照。

5、如权利要求1所述的应用程序中存取文件数据的方法,其特征在于,如果该修

改记录为空,则当前数据与读取数据相同。

6、如权利要求1所述的应用程序中存取文件数据的方法,其特征在于,该根据修

改记录对文件内容进行更新并储存的步骤是在应用程序退出时进行的。

7、如权利要求1所述的应用程序中存取文件数据的方法,其特征在于,该根据修

改记录对文件内容进行更新并储存的步骤是在使用者强制要求保存文件时进行的。

8、如权利要求1所述的应用程序中存取文件数据的方法,其特征在于,该根据修

改记录对文件内容进行更新并储存的步骤,还包括如下步骤:

创建临时文件;

按照对该文件的修改位置对该修改记录进行排序;

将没有修改的数据与修改的数据依序存入该临时文件中;及

用该临时文件取代源文件。

9、如权利要求8所述的应用程序中存取文件数据的方法,其特征在于,该用临时

文件取代源文件的步骤,还包括如下步骤:

删除该源文件;及

将该临时文件更名为该源文件。

说 明 书

技术领域

本发明涉及一种对文件中的数据的存取方法,特别是涉及一种在应用程序中对比特

数较大的文件的存取方法。

背景技术

文件处理是计算机应用中最常见的需求,也是大量应用程序软件中频繁需要处理的

事务。由于一些应用程序运行时,需要经常的对同一个文件中的不同部分的数据反

复的读取、计算,并将返回结果存入该文件中,以备下次读取之用,因此,文件处

理的时间决定了应用程序的运行速度,而且,文件的比特数越大,所需要的处理时

间就越长。

在已知技术中,读写一个文件的过程通常是要先打开文件,取得文件句柄(Handle),

然后将指针定位(Seek)至要读入数据的位置(设该点为Position1),然后读取长度为

lenght1的相关数据,将该数据进行程序化处理得出长度为lenght2的结果数据,然

后创建一临时文件(~file),将文件中从文件头开始至position1的数据依次写入该临

时文件中,再将结果数据写入position1,之后,再将文件中从position1+length1开

始至文件尾的数据追加入临时文件的尾部,最后删除源文件(file),将临时文件

(~file)更名为file。

对文件的读写之所以需要这样进行是因为要处理的文件比特数很大,不能一次性全

部读入内存处理,而且,需要新写入的数据在文件的中间部位,而文件的存储是连

续的,所以不能直接插入新数据。

然而,目前使用的文件处理方式会使文件中插入/删除数据的操作需要较长的处理

时间。文件所需的处理时间为:(原文件长度+数据变化长度)×处理单位字节所需时

间×对文件内容修改的次数。由此可见,文件越长,需要的处理时间也越长,修改

次数越频繁,其保存数据所需要的时间也会成倍的增加。

发明内容

本发明为解决上述问题而提供一种应用程序中存取文件数据的方法,其使用内存记

录的方式来储存程序处理过程中对文件的改变量,而使文件内容有变化后不必每次

都进行存档操作。

本发明提供一种应用程序中存取文件数据的方法,首先在内存中创建储存有文件数

据修改量的记录,根据该修改记录,将从该文件中读取的数据修改为当前数据,然

后将该当前数据进行程序化处理以生成结果数据,将该结果数据储存于该内存记录

以生成新的修改记录,最后根据该修改记录对文件内容进行更新并储存。

本发明由于使用了内存记录的方式来储存每次程序化处理对文件的改变量,因此可

以在对文件的全部操作结束之前不进行存盘操作,而根据内存记录修改每次读出的

数据,从而保证了当前数据的正确性,也因此大大减少了文件处理所需要的时间,

本发明对文件处理所需的时间为:(源文件长度+内存记录长度)×处理单位比特所需

的时间。

附图说明

图1为本发明的应用程序中存取文件数据的方法流程图;

图2为本发明所提供的根据修改记录将从文件中读取的数据修改为当前数据的步骤

流程图;

图3为本发明所提供的根据修改记录对文件内容进行更新并储存的步骤流程图;

图4为本发明所提供的源文件数据实施例示意图;及

图5A-图5D为根据本发明对文件数据内容进行储存的实施例示意图。

具体实施方式

本发明提供一种应用程序中存取文件数据的方法,其通过在内存中记录文件数据修

改量的方式以提高程序运行中大文件的写入效率,如图1所示,该方法包括:在内

存中创建储存有文件数据修改量的记录(步骤101);根据该修改记录,将从该文件

中读取的数据修改为当前数据(步骤102);将该当前数据进行程序化处理以生成结

果数据(步骤103);将该结果数据储存于该内存记录以生成新的修改记录(步骤104);

根据该修改记录对文件内容进行更新并储存(步骤105)。

其中该修改记录包括数据起始位置、数据原始长度、数据结果长度、数据指针以及

数据内容的记录。

其中该根据修改记录将从文件中读取的数据修改为当前数据的步骤,如图2所示,

还包括如下步骤:打开文件取得文件句柄(Handle)(步骤201);将文件指针定位

(Seek)至要读入数据的位置(步骤202);读取一段数据,并与修改记录相参照(步骤

203);用修改记录中相同位置的数据取代读入的数据(步骤204)。

当对源文件的所有相关操作全部完成后,或在应用程序退出时,或使用者强制要求

保存文件时,才根据修改记录对文件内容进行更新并储存,如图3所示,包括如下

步骤:创建一临时文件(步骤301);按照对该文件的修改位置对该修改记录进行排

序(步骤302);将没有修改的数据与修改的数据依序存入该临时文件中(步骤303);

用该临时文件取代该源文件(步骤304)。

用临时文件取代源文件的步骤,可以先删除该源文件,再将该临时文件更名为该源

文件即可。

下面以具体的数据实例来说明本发明的处理过程,假设要存取的文件名为filename,

出于篇幅的考虑,在这里仅对该文件的前若干字节进行操作。如图4所示,即为该

文件的数据内容(以十六进制表示)。

首先使用文件操作函数(如fopen)打开名为filename的文件,与此同时要在存储器

中创建文件修改的记录列表list,然后使用文件操作函数(如fseek)对要读取的数据

进行定位,假设要从0x0012<postion1>的位置开始读取数据,使用文件操作

函数(如fread)从中读出所需的数据,假设要读出6个字节<length1>的数据。

那么此时读取的数据为[6F 72 64 3A32 30],由于此时文件修改的记录列表list为空,

因此所读出的数据保持不变。

然后应用程序对读出的数据进行处理。当从文件中读出数据后,应用程序就要根据

需要对这些数据进行处理,经过处理后的数据不论在内容上还是在字节大小上都有

可能与原来的数据不同。假设经过处理后数据的长度为7个字节<length2>、

数据内容改变为[70 73 65 3B 33 31 F2]。此时,根据应用程序的要求需将处理后的

数据储存在文件中,那么,就需要在内存中创建一个定义如下的结构体data1:

struct FileData{

unsigned long ulPosition;数据起始位置

unsigned long ulLength;数据原始长度

unsigned long ulSize;数据目前长度

char*pData;数据指针}

其中:

tion=0x0012;

th=6;

=7;

=&[70 73 65 3B 33 31 F2];

然后将data1加入对文件修改的记录列表list之中。

如果应用程序再次从文件中读取数据,假设此次从0x0015<position2>的位置

读出长度为10个字节<length3>的数据。根据上面的步骤读出的数值应为

[3A 32 30 0D 0A 22 54 6F 70 22]。接着要根据文件修改的记录列表list之中所记录

的内容对读出的数据进行修改,修改后的结果为[3B33 31 F2 0D 0A 22 54 6F 70]。

参照上面的流程,假设应用程序对该数据处理后,数据改变为

[3B 33 31F2 0A 0D 22 54 6F 70],长度仍为10个字节<length4>。

对处理后的结果数据仍需要进行储存,参照上面的流程,处理后的数据data2的内

容为:

tion=0x0015;

th=10;

=10;

=&[3B 33 31 F2 0A 0D 22 54 6F 70];

data2也应加入对文件修改的记录列表list之中。

假设此时应用程序关于文件的处理全部完成,需要将文件filename的内容更新。那

么要创建一个临时文件~filename,存储的过程为:

首先存储0-position1的内容,存储后的临时文件内容如图5A所示;

然后根据文件修改的记录列表list中的内容写入data1的数据内容,存储后的临时

文件内容如图5B所示;

然后根据文件修改的记录列表list中的内容写入data2的数据内容,存储后的临时

文件内容如图5C所示;

最后写入余下的数据,存储后的临时文件内容如图5D所示;

之后将文件filename删除,将文件~filename更名为filename即可。

以上所述,仅为本发明其中的较佳实施例而已,并非用来限定本发明的实施范围;

凡依本发明权利要求书所作的均等变化与修饰,均应包含在本发明的权利要求书所

要求保护的范围之内。