CN101414299A - 复合文档的修复方法和装置 - Google Patents
复合文档的修复方法和装置 Download PDFInfo
- Publication number
- CN101414299A CN101414299A CNA2008101199801A CN200810119980A CN101414299A CN 101414299 A CN101414299 A CN 101414299A CN A2008101199801 A CNA2008101199801 A CN A2008101199801A CN 200810119980 A CN200810119980 A CN 200810119980A CN 101414299 A CN101414299 A CN 101414299A
- Authority
- CN
- China
- Prior art keywords
- sector
- allocation table
- belongs
- host sectors
- catalogue
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种复合文档的修复方法和装置。该方法主要包括:根据扇区中存储的内容和预定的评价规则,对待修复的复合文档的各个扇区进行分析,分别判断出属于扇区分配表、主扇区分配表、短流扇区分配表和目录的扇区;根据复合文档的存储结构和所述属于扇区分配表、主扇区分配表、短流扇区分配表和目录的扇区,恢复出所述复合文档的扇区分配表、主扇区分配表、短流扇区分配表、目录、流数据和短流数据。利用本发明,可以根据扇区中存储的内容和预定的评价规则,来恢复出复合文档的扇区分配表、主扇区分配表、短流扇区分配表、目录、流数据和短流数据等信息。从而对损坏的复合文档文件进行数据修复和文件结构的恢复,使得用户能够正常使用复合文档文件。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种复合文档的修复方法和装置。
背景技术
通过网络即时通讯工具进行即时通讯,已经被大多数的用户所接受,不但在用户平时的休闲娱乐中,而且在用户的工作中也得到广泛的使用。在上述即时通讯的过程中,需要解决的一个基本问题是软件数据和用户数据的存储和访问问题,目前,主要用复合文档来存储该软件数据和用户数据。
复合文档“借用”文件***的概念,在文件内部构造了一个类似于文件***的树状层次结构,该树状层次结构的节点可以是两种对象:存储和流。存储类似于文件***的目录,存储中可以包含其它存储和流。流则类似于文件***的文件,用于存储数据。每个存储或者流都是一个可独立进行读写操作的对象。流和存储的命名规则和文件***也是相似的,同一存储下的流和存储不能重名,不同存储下可以有同名的流,每个复合文档都有一个根存储。
在上述即时通讯的过程中,复合文档中存储的软件数据和用户数据,比如聊天记录数据文件可能被破坏,从而导致影响用户对软件的使用,给用户因造成一定的损失。
现有技术中有各种针对磁盘文件***的修复软件和技术,比如NortonDiskDoctor(诺顿磁盘医生)等软件。这些软件和技术主要针对现有的文件***,目前,现有技术中还没有针对复合文档的修复技术和软件。
发明内容
本发明的实施例提供了一种复合文档的修复方法和装置,以对被损坏的复合文档进行修复。
一种复合文档的修复方法,包括:
根据扇区中存储的内容和预定的评价规则,对待修复的复合文档的各个扇区进行分析,分别判断出各个扇区的扇区类型
根据复合文档的存储结构和所述各个扇区的扇区类型,对所述复合文档进行恢复。
一种复合文档的修复装置,包括:
扇区类型判断模块,用于根据扇区中存储的内容和预定的评价规则,对待修复的复合文档的各个扇区进行分析,分别判断出各个扇区的扇区类型;
恢复处理模块,用于根据复合文档的存储结构和所述各个扇区的扇区类型,对所述复合文档进行恢复。
由上述本发明的实施例提供的技术方案可以看出,本发明实施例通过根据扇区中存储的内容和预定的评价规则,来恢复出复合文档的扇区分配表、主扇区分配表、短流扇区分配表、目录、流数据和短流数据等信息。从而可以对损坏的复合文档文件进行数据修复和文件结构的恢复,使得用户能够正常使用复合文档文件,并且最大程度恢复丢失和损坏的数据。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为一种扇区分配表的结构形式示意图;
图2为本发明实施例一提供的一种复合文档的修复方法的处理流程图;
图3为本发明实施例一提供的一种红黑树的层次结构示意图;
图4为本发明实施例二提供的一种复合文档的修复装置的具体实现结构图;
图5为本发明实施例二提供的另一种复合文档的修复装置的具体实现结构图。
具体实施方式
在本发明实施例中,根据扇区中存储的内容和预定的评价规则,对待修复的复合文档的各个扇区进行分析,分别判断出各个扇区的扇区类型,该扇区类型包括但不限于属于扇区分配表、主扇区分配表、短流扇区分配表和目录的扇区,该扇区类型还可以为以后可能出现在复合文档中的除了扇区分配表、主扇区分配表、短流扇区分配表和目录之外的其它存储结构所对应的扇区。
然后,根据复合文档的存储结构和所述属于扇区分配表、主扇区分配表、短流扇区分配表和目录的扇区,恢复出所述复合文档的扇区分配表、主扇区分配表、短流扇区分配表、目录、流数据和短流数据。
进一步地,获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于扇区分配表,在得到了所有属于扇区分配表的扇区后,再获取剩下的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表的评价规则,对所述剩下的扇区进行打分,依次遍历所述剩下的扇区中记录的所有扇区号并依次进行相应的打分,根据所述剩下的扇区的最后得分得到所述剩下的扇区属于主扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述剩下的扇区属于主扇区分配表,并保存所述剩下的扇区中记录的最大和最小的扇区号;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于主扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于主扇区分配表,并保存所述扇区中记录的最大和最小的扇区号;在得到了所有属于主扇区分配表的扇区后,再获取剩下的扇区中记录的扇区号信息,根据该扇区号信息和预定的扇区分配表的评价规则,对所述剩下的扇区进行打分,依次遍历所述剩下的扇区中记录的所有扇区号并依次进行相应的打分,根据所述剩下的扇区的最后得分得到所述剩下的扇区属于扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于扇区分配表;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表、扇区分配表的评价规则,对所述扇区分别进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分分别得到所述扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于P2,则判断所述扇区属于扇区分配表;如果P2大于P1,则判断所述扇区属于主扇区分配表;如果P2等于P1,并且P1大于预定的扇区分配表的判决值,P2不大于预定的主扇区分配表的判决值,则判断所述扇区属于扇区分配表;如果P2等于P1,并且P1不大于预定的扇区分配表的判决值,P2大于预定的主扇区分配表的判决值,则判断所述扇区属于主扇区分配表;如果P2等于P1,并且P1大于预定的扇区分配表的判决值,P2大于预定的主扇区分配表的判决值,则判断该扇区属于待确认的扇区;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表、扇区分配表的评价规则,分别对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分分别得到所述扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于预定的扇区分配表的判决值,而P2不大于预定的主扇区分配表的判决值,则判断该扇区属于扇区分配表;如果P1不大于预定的扇区分配表的判决值,而P2大于预定的主扇区分配表的判决值,则判断该扇区属于主扇区分配表;如果P1大于预定的扇区分配表的判决值,并且P2大于预定的主扇区分配表的判决值,此时,比较P1和P2的大小,如果P1大于P2,则判断该扇区属于扇区分配表;如果P2大于P1,则判断该扇区属于主扇区分配表。
进一步地,获取所述判断出的属于扇区分配表的扇区中记录的扇区号信息,根据该扇区号信息和预定的短流扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于短流扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于短流扇区分配表;
根据所述判定的属于短流扇区分配表的扇区信息,对所述判断出的属于扇区分配表的扇区信息进行更正。
进一步地,获取所述判断出的属于扇区分配表、主扇区分配表和短流扇区分配表的扇区之外剩下的扇区中记录的目录项信息,根据该目录项信息和预定的目录的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有目录项并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于目录的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于目录。
进一步地,从所述属于主扇区分配表的各个扇区中找出扇区号最小的扇区,作为主扇区分配表占用的第一个扇区,根据主扇区分配表的每个扇区最后四个字节存储下一个扇区号和主扇区分配表的扇区中存储的扇区号是升序的特征信息,以及所述保存的每个扇区中记录的最小和最大扇区号信息,恢复出主扇区分配表;
根据所述主扇区分配表找到所有属于扇区分配表的扇区,根据扇区分配表和主扇区分配表的结构特征,将所述找到的属于扇区分配表的各个扇区与所述判断出的属于扇区分配表的各个扇区互相进行验证,排除无效的扇区。并且对所述待确认的扇区进行验证,判断出该待确认的扇区是属于扇区分配表或主扇区分配表。确定属于扇区分配表的最终的各个扇区,获取该最终的各个扇区中记录的扇区号信息,恢复出扇区分配表。
进一步地,从所述判断出的属于短流扇区分配表的各个扇区中找出扇区号最小的扇区,作为短流扇区分配表占用的第一个扇区,根据该第一个扇区从所述恢复出的扇区分配表中获取短流扇区分配表占用的扇区链,获取该扇区链中的各个扇区中记录的扇区号信息,恢复出短流扇区分配表;
从所述判断出的属于目录的各个扇区中找出扇区号最小的扇区,作为目录占用的第一个扇区,根据该第一个扇区从扇区分配表中获取目录占用的扇区链,获取该扇区链中的各个扇区中记录的目录项信息,恢复出整个目录。
进一步地,获取所述目录所占用的扇区中记录的目录项信息,检查目录项中的数据的有效性,将数据为无效的目录项标记为错误节点;将每一个目录项作为一个节点,对整个目录进行逐层遍历;
所述对整个目录的逐层遍历完成后,对未访问过且未标记为错误节点的节点***到根存储,该节点为丢失的数据;对标记为错误节点,并且占用的第一个扇区号及数据大小合法的目录项,通过所述扇区分配表进行修复;对标记为错误节点的剩余目录项数据进行清理,该节点为冗余或者垃圾数据,然后,重新生成整个复合文档的目录。
进一步地,遍历所述重新生成的目录中的目录项,根据目录项中记载的流文件或者短流文件占用的第一个扇区号,以及流文件或者短流文件的大小,从所述扇区分配表中查找出该流文件所占用的扇区链或者从所述短流扇区分配表中查找该短流文件所占用的扇区链;
将所述查找出的流文件或短流文件所占用的扇区链,与所述流扇区分配表或短流扇区分配表中本身记载的相应的扇区链进行比较,将较长的扇区链的作为所述流文件或短流文件所占用的最终扇区链;
根据所述流文件或短流文件所占用的最终扇区链信息,对扇区分配表或短流扇区、目录进行相应的修改,使扇区分配表或短流扇区、目录保持一致。
进一步地,根据复合文档的文件头的结构特点,对所述待修复的复合文档的文件头进行恢复,获取恢复出的文件头中包含的关键信息,该关键信息包括扇区分配表占用的扇区数、目录占用的第一个扇区号、短流扇区分配表占用的第一个扇区号和占用的扇区数、主扇区分配表占用的第一个扇区号和占用的扇区数;
如果所述恢复出来的扇区分配表、主扇区分配表、短流扇区分配表和目录与所述恢复出的文件头中包含的相关关键信息不一致,则对所述文件头中包含的相关关键信息进行修正。
为了更好地对本发明实施例进行描述,下面首先对复合文档的存储结构进行描述。
复合文档的存储结构由一个文件头以及若干个扇区组成。文件的头部和每个扇区的默认大小为512个字节。每个扇区都有一个编号,称为扇区号,扇区号从0开始计算,用4个字节表示。
一组互相关联的扇区链接起来便组成扇区链,扇区链以-2表示结束,例如,某个流的大小为2000字节,需要占用4个扇区,这4个扇区的扇区号分别是:1000,1003,500,100,那么这四个扇区组成的扇区链的结构形式如下述表1所示:
表1
扇区号 | 1000 | 1003 | 500 | 100 |
下一个扇区: | 1003 | 500 | 100 | -2 |
从上述表1可以看出,在扇区链中的每个扇区中都存储了下一个扇区的扇区号信息。
除了流和存储之外,在复合文档***中还包括如下的几个概念:主扇区分配表,扇区分配表,短流扇区分配表和目录,下面分别对上述几个概念进行介绍。
扇区分配表:用于存储整个复合文档的扇区的分配信息,扇区分配表中主要记录了若干个扇区链信息,通过扇区分配表可以得到某个流文件占用的扇区链,以及短流扇区分配表、目录所占用的扇区链信息。
一种扇区分配表的结构形式如图1所示,在图1中,当扇区中记录的扇区号的值小于0时,表示一些特殊意义:
-1:表示该扇区为空的扇区,即未存储任何数据的扇区;
-2:表示该扇区为扇区链的结尾;
-3:表示该扇区由扇区分配表占用;
-4:表示该扇区由主扇区分配表占用。
主扇区分配表,用于存储扇区分配表占用的扇区信息。上述扇区分配表同样是存储在复合文档文件的扇区中,主扇区分配表中正是记录扇区分配表所占用的扇区链信息,并且主扇区分配表通过每个扇区的最后四个字节链接起来。主扇区分配表中的每一项存储一个扇区号,表示该扇区号所对应的扇区存储的是主扇区分配表的信息。例如,一种主扇区分配表的结构形式如下述表2所示:
表2
主扇区分配表的每个扇区最多存储127个扇区号,最后一个扇区号指出下一个存放主扇区分配表的扇区。
主扇区分配表本身占用的前109个扇区号信息固定存储在复合文档的第76至512字节,即复合文档的文件头的尾部。如果整个复合文档的大小超过(512*109*128+512)个字节,那么就需要占用其它的扇区来存储主扇区分配表。
短流扇区分配表,用于存储复合文档中的小文件(小于4096字节)所占用的扇区信息。在复合文档中,小文件会保存到一个特殊位置,而通过这个短流扇区分配表,得到小文件在特殊位置中占用的小扇区的扇区链。短流扇区分配表本身占用的扇区链信息保存在扇区分配表中。上述小扇区的大小一般为64字节。
目录,用于保存存储和流的层次信息,也就是将整个复合文档中的存储和流的层次信息存储在一个目录表中,该目录表包括若干个目录项,该目录表同样存在指定一些扇区中。文件头的数据结构中存储了目录占用的第一个扇区的扇区号,整个目录表所占用的扇区链可以通过这个扇区号从扇区分配表中获取。
目录可以看成一种特殊的流文件,目录和流文件一样也是保存在存储下。每个扇区存储4个目录项,即每个目录项占用128个字节,每个目录项对应于一个目录号,用来唯一标识该目录项,目录号按照目录表中的顺序,从0开始。每个目录项的类型主要为三种类型:根存储(目录号为0)、存储和流。每个目录项包含名字、类型、目录链接信息、占用的第一个扇区号、存储数据大小等重要信息。目录链接信息包括左节点、右节点和根节点。
将每一个目录项作为一个节点,同一目录层次的节点,通过该节点的左右节点的目录号链接起来,父子层次的节点通过根节点链接起来。每一目录层次的链接关系存储在一棵红黑树的数据结构(一种二叉排序树,查找效率非常高,能够很快的定位目录)中。目录的左节点是链接同级的兄弟节点,右节点是指向下一级目录的红黑树的根节点。因此,查找文件或者目录就是在按层次对每一个红黑树进行遍历。在构建红黑树的过程中,一个节点究竟作为左节点还是右节点,是通过比较其名字来判断的。一个节点比另一个小是指其名字的长度更短,如长度一样,则逐字符比较,比较规则是:左节点<根节点<右节点。
一个目录项的结构形式如下述表3所示:
表3
offset | size | Field Name |
0 | 64 | Entry(目录项)名称 |
64 | 2 | Entry名的长度 |
66 | 2 | Entry的类型:0=空,1=目录,2=流文件,3=LockBytes(unknown)(锁定字节),4=Property(unknown)(属性),5=根目录 |
67 | 1 | Entry的节点颜色 |
68 | 4 | 左边子节点的DID(目录项标识) |
72 | 4 | 右边子节点的DID(目录项标识) |
76 | 4 | 在红黑树里的根节点的DID |
80 | 16 | Entry的唯一标示(可以为0) |
96 | 4 | 用户标示(可以为0) |
100 | 8 | Entry的创建时间 |
108 | 8 | Entry的修改时间 |
116 | 4 | 流文件或者小文件占用的第一个扇区的扇区号 |
120 | 4 | Entry的大小 |
124 | 4 | 保留字节 |
复合文档的文件头中保存了复合文档一些关键信息,该关键信息包括:扇区分配表占用的扇区数、目录占用的第一个扇区号和占用的扇区数、短流扇区分配表占用的第一个扇区号和占用的扇区数、主扇区分配表占用的第一个扇区号和占用的扇区数。该文件头的结构格式如下述表4所示:
表4
offset | size | Field Name |
0 | 8 | 复合文档标示头,固定值 |
8 | 16 | 文件唯一标示值,可以为0 |
24 | 2 | 文件格式修正版本号(一般是0x003E) |
26 | 2 | 文件格式版本 |
28 | 2 | 字节序类型 |
30 | 2 | 扇区的大小,该值纪录为ssz,Sector_size=2ssz |
32 | 2 | 小扇区的大小,该值纪录为sssz,Short_Secotr_size=2sssz |
34 | 10 | 保留字节 |
44 | 4 | 扇区分配表占用的扇区总数 |
48 | 4 | 目录占用的第一个扇区的扇区号 |
52 | 4 | 保留字节 |
56 | 4 | 标准流的最小长度(一般为4096) |
60 | 4 | 短流扇区分配表占用的第一个扇区的扇区号 |
64 | 4 | 短流扇区分配表占用的扇区的总数 |
68 | 4 | 主扇区分配表占用的第一个扇区的扇区号 |
72 | 4 | 主扇区分配表占用的扇区的总数 |
76 | 436 | 主扇区分配表的第一个部分 |
为便于对本发明实施例的理解,下面将结合附图以几个具体实施例为例做进一步的解释说明,且各个实施例并不构成对本发明实施例的限定。
实施例一
该实施例提供的一种复合文档的修复方法的处理流程如图2所示,包括如下处理步骤:
步骤21:根据扇区存储的内容进行扇区特征分析和评价,得出该扇区所属的扇区类型。
根据上述对复合文档的描述,一个扇区中存储的内容可能是下述几种类型中的之一:
扇区分配表,
主扇区分配表,
短流扇区分配表,
目录,
流数据或者空数据(未使用的扇区)
在本发明实施例中,把一个扇区中存储的内容的类型称为扇区类型。
首先,确定需要修复的复合文档的所有扇区,遍历每一个扇区,对每个扇区中存储的内容的特征进行分析,通过设定的评价机制,计算扇区属于不同上述扇区类型的概率。在本发明实施例中,对每种扇区类型分别制定一种评价规则,根据该评价规则对每个扇区进行打分,分数越高,表示扇区属于该扇区类型的概率越高。
下面分别说明各种扇区类型的评价规则:
1、扇区分配表的评价规则:扇区分配表中每个扇区的内容为512个字节,每个扇区中共记录128个扇区号,每个扇区中记录的扇区号的可能取值是:-1,-2,-3,-4,或者大于等于0,小于最大扇区号,最大扇区号=(复合文档大小-512)/512)。
根据上述特征,建立如下评价规则:
如果扇区中记录的扇区号大于等于0,小于最大扇区号,则给该扇区加2分;
如果扇区中记录的扇区号等于-3,-4,则给该扇区加2分;
如果扇区中记录的扇区号等于-1或-2,则给该扇区加1分;
如果扇区中记录的扇区号不属于以上任何情况,比如,扇区中没有记录任何扇区号,而是记录流数据,则给该扇区减2分。
针对一个待分析的扇区,获取该扇区中记录的扇区号,根据上述评价规则对该扇区进行打分,依次遍历所述扇区中记录的所有扇区号(比如记录了128个扇区号)并依次进行相应的打分,得到所述扇区的最后得分S1,再对S1进行归一化处理,得到待分析的扇区属于扇区分配表的估计概率:
P1=(S1+256)/512
当P1的取值大于预定的扇区分配表的判决值时,则可以判定该待分析的扇区属于扇区分配表。
2、主扇区分配表的评价规则:主扇区分配表的扇区内容为512个字节,每个扇区共记录128个扇区号,每个扇区中记录的扇区号的可能取值是:大于等于0,小于最大扇区号;-1但不可能全部为-1;至多只有一个-2,并且-2之后的扇区号只能是-1或者-2刚好是最后一个。另外主扇区分配表中记录的扇区号具有升序特征,因为主扇区分配表占用的扇区号是顺序递增的。
根据上述特征,建立如下评价规则:
如果扇区中记录的扇区号大于等于0,小于最大扇区号,则给该扇区加2分;
如果扇区中记录的扇区号等于-1但不全为-1,则给该扇区加1分;
如果扇区中记录的扇区号等于-2,并且-2之后的扇区号只能-1或者-2刚好是最后一个,则给该扇区加10分;
如果扇区中记录的扇区号不属于以上任何情况,比如,扇区中没有记录任何扇区号,而是记录流数据,则给该扇区减2分。
针对一个待分析的扇区,获取该扇区中记录的扇区号,根据上述评价规则对该扇区进行打分,依次遍历所述扇区中记录的所有扇区号(比如记录了128个扇区号)并依次进行相应的打分,得到所述扇区的最后得分S2,再对S2进行归一化处理,得到待分析的扇区属于主扇区分配表的估计概率:
P2=(S2+256)/512
当P2的取值大于预定的主扇区分配表的判决值时,则可以判定该待分析的扇区属于主扇区分配表。同时保存该待分析的扇区中记录的最大和最小的扇区号。
在实际应用,可以先根据上述扇区分配表的评价规则,遍历需要修复的复合文档的所有扇区,得到所有属于扇区分配表的扇区。然后,再根据上述主扇区分配表的评价规则,遍历剩下的扇区得到所有属于主扇区分配表的扇区。
或者,
可以先根据上述主扇区分配表的评价规则,遍历需要修复的复合文档的所有扇区,得到所有属于主扇区分配表的扇区。然后,再根据上述扇区分配表的评价规则,遍历剩下的扇区得到所有属于扇区分配表的扇区。
或者,
对于一个扇区,分别根据扇区分配表和主扇区分配表的评价规则进行打分,分别得到该扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于P2,则判断该扇区属于扇区分配表;如果P2大于P1,则判断该扇区属于主扇区分配表。
如果P2等于P1,此时,如果P1大于预定的扇区分配表的判决值,而P2不大于预定的主扇区分配表的判决值,则判断该扇区属于扇区分配表;如果P1不大于预定的扇区分配表的判决值,而P2大于预定的主扇区分配表的判决值,则判断该扇区属于主扇区分配表;如果P1大于预定的扇区分配表的判决值,并且P2大于预定的主扇区分配表的判决值,则判断该扇区属于待确认的扇区,然后,根据后续恢复出的主扇区分配表,以及扇区标识为-3表示该扇区由扇区分配表占用,标识为-4表示该扇区由主扇区分配表占用等信息,来判定该扇区是属于扇区分配表或主扇区分配表。
或者,
对于一个扇区,分别根据扇区分配表和主扇区分配表的评价规则进行打分,分别得到该扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于预定的扇区分配表的判决值,而P2不大于预定的主扇区分配表的判决值,则判断该扇区属于扇区分配表;如果P1不大于预定的扇区分配表的判决值,而P2大于预定的主扇区分配表的判决值,则判断该扇区属于主扇区分配表;如果P1大于预定的扇区分配表的判决值,并且P2大于预定的主扇区分配表的判决值,此时,比较P1和P2的大小,如果P1大于P2,则判断该扇区属于扇区分配表;如果P2大于P1,则判断该扇区属于主扇区分配表。
在本发明实施例中,首先根据上述扇区分配表、主扇区分配表的评价规则,分别判断出属于扇区分配表和属于主扇区分配表的扇区。
然后,再根据下述介绍的短流扇区分配表、目录的评价规则,判断出其它的属于短流扇区分配表、目录的扇区。
3、短流扇区分配表的评价规则基本和扇区分配表的评价规则相同,但由于短流扇区分配表的扇区是通过扇区分配表分配的,因此当前被分析扇区如果属于短流扇区分配表的,那么该扇区必定出现在已判定出的属于扇区分配表的扇区中。
根据上述特征,建立如下评价规则:
如果扇区中记录的扇区号大于等于0,小于最大扇区号,则给该扇区加2分
如果扇区中记录的扇区号等于-1或-2,则给该扇区加1分
如果扇区中记录的扇区号不属于以上任何情况,比如,扇区中没有记录任何扇区号,而是记录流数据,则给该扇区减2分。
从已判定出的属于扇区分配表的扇区中依次确定一个待分析的扇区,获取该扇区中记录的扇区号,根据上述评价规则对该扇区进行打分,依次遍历所述扇区中记录的所有扇区号(比如记录了128个扇区号)并依次进行相应的打分,得到所述扇区的最后得分S3,再对S3进行归一化处理,得到待分析的扇区属于短流扇区分配表的估计概率:
P3=(S3+256)/512
当P3的取值大于预定的短流扇区分配表的判决值时,则可以判定该待分析的扇区属于短流扇区分配表。
根据上述判断出的属于短流扇区分配表的扇区信息,对上述已经判断出的属于扇区分配表的扇区信息进行更正。
4、目录的评价规则比较简单直观,根据上述目录项的结构形式特征,建立如下评价规则:
如果扇区中记录的Entry(目录项)的名称的长度,以及该名称本身有效,则给该扇区加16分,否则该扇区减16分;
如果扇区中记录的目录项的类型为合法,则该扇区加16分,否则给该扇区减16分;
如果扇区中记录的流文件或者短流文件的第一个扇区的扇区号小于最大扇区号,则给扇区加16分,否则给扇区减16分。
如果扇区中记录的目录项的大小为合法,则给扇区加16分,否则给扇区减16分。
在需要修复的复合文档的所有扇区中,除了上述已经判断出属于扇区分配表、主扇区分配表和短流扇区分配表的扇区之外剩下的扇区中依次确定一个待分析的扇区,遍历待分析的扇区中记录的所有目录项,比如4个目录项,得到该扇区属于目录的总分S4,再对S4进行归一化处理,得到待分析的扇区属于目录扇区的估计概率:
P4=(S4+256)/512
当P4的取值大于预定的目录的判决值时,则可以判定该待分析的扇区属于目录。
在需要修复的复合文档的所有扇区中,除了已经判断出属于扇区分配表、主扇区分配表、短流扇区分配表和目录的扇区之外剩下的扇区便是属于流文件的扇区或者空扇区。
步骤22、根据复合文档的文件格式,结合扇区类型分析的结果,对复合文档的文件头和主扇区分配表进行恢复。
复合文档的文件头信息中包含的上述关键信息绝大部分是静态的固定值,因此,直接根据复合文档的格式信息即可直接对文件头进行修复。该关键信息包括扇区分配表占用的扇区数,目录占用的第一个扇区号,短流扇区分配表占用的第一个扇区号和占用的扇区数,主扇区分配表占用的第一个扇区号和占用的扇区数。在实际应用中,由于复合文档可能被破坏,上述关键信息可能不准确。
从上述判断出的属于主扇区分配表的各个扇区中找出扇区号最小的扇区,作为主扇区分配表占用的第一个扇区,再根据主扇区分配表的每个扇区最后四个字节存储下一个扇区号的特征,可以将上述属于主扇区分配表的各个扇区依次连接起来。然后,再根据属于主扇区分配表的扇区中存储的扇区号是升序的特征信息,以及上述保存的每个扇区中记录的最小和最大扇区号,可以得到属于主扇区分配表的扇区中记录的所有扇区号的信息,即恢复出主扇区分配表。
如果上述恢复出来的主扇区分配表与上述文件头中记载的相关关键信息不一致,则对上述文件头中记载的相关关键信息进行修正。
步骤23、根据恢复出的主扇区分配表,结合扇区类型分析的结果,对扇区分配表和短流扇区分配表进行恢复。
在主扇区分配表恢复出来后,根据该主扇区分配表可以找到所有属于扇区分配表的扇区。根据上述扇区标识为-3表示该扇区由扇区分配表占用,标识为-4表示该扇区由主扇区分配表占用等信息,将上述找到的所有属于扇区分配表的扇区与上述判断出的属于扇区分配表的各个扇区互相进行验证,排除无效的扇区。并且如果在上述扇区类型的确认过程中,出现了上述待确认的扇区,则也对该待确认的扇区进行验证,判断出该待确认的扇区是属于扇区分配表或主扇区分配表。最终确定出属于扇区分配表的各个扇区。
然后,获取属于扇区分配表的各个扇区中记录的扇区号信息,恢复出扇区分配表,并且对扇区分配表中的扇区链进行分析,找出所有可能的扇区链,为后续的分析做准备。
在扇区分配表恢复出来后,从上述判断出的属于短流扇区分配表的各个扇区中找出扇区号最小的扇区,作为短流扇区分配表占用的第一个扇区。根据该第一个扇区从扇区分配表中获取短流扇区分配表占用的扇区链,获取各个扇区中记录的扇区号信息,恢复出短流扇区分配表。
如果上述恢复出来的短流扇区分配表与上述文件头中记载的相关关键信息不一致,则对上述文件头中记载的相关关键信息进行修正。
步骤24、根据复合文档的文件格式,结合扇区特征分析的结果,对复合文档的目录、短流文件和流文件进行恢复。
从上述判断出的属于目录的各个扇区中找出扇区号最小的扇区,作为目录占用的第一个扇区。根据该第一个扇区从扇区分配表中获取目录占用的扇区链,获取各个扇区中记录的目录项信息,恢复出整个目录。
如果上述恢复出来的目录信息与上述文件头中记载的相关关键信息不一致,则对上述文件头中记载的相关关键信息进行修正。
在获取了整个目录所占用的各个扇区后,针对每一个扇区,遍历该扇区中的每一个目录项,检查目录项中的数据的有效性。比如,检查目录项名字最大长度是否为64个字节,如果不是则记录该目录项为非法;检查目录项链接到的目录号是否在目录列表之内,如果不是或者等于-1则记录该目录项为非法。将非法的目录项标记为错误节点。
然后,将每一个目录项作为一个节点,对整个目录层次进行逐层遍历,每一层目录按广度遍历红黑树,即对红黑树从上往下遍历,比如,一种红黑树的层次结构示意图如图3所示,则遍历的顺序是:1,2,3,4,5,6,7。对于每一个节点,检查该节点的左右节点或者根节点是否被标记为错误节点,如果是,则将该节点链接的目录项标识为-1,并且标记该节点为已访问。上述目录项标识为-1表示该节点的链接关系是透明的,即可以直接穿过该节点访问该节点的左右节点或者根节点。
遍历完成后,对未访问过且未标记为错误节点的节点***到根存储,该节点为丢失的数据。对标记为错误节点,并且占用的第一个扇区号及数据大小合法的目录项,通过扇区分配表进行修复。对标记为错误节点的剩余目录项数据进行清理,该数据为冗余或者垃圾数据。然后,重新生成整个复合文档的目录。
如果上述重新生成的目录信息与上述文件头中记载的相关关键信息不一致,则对上述文件头中记载的相关关键信息进行修正。
最后,根据上述恢复出来的复合文档的文件格式、扇区分配表和目录等信息,对短流文件和流文件数据进行检测和修复。
遍历目录中的每个目录项,取出目录项中记载的流文件(或短流文件)占用的第一个扇区号和流文件(或短流文件)的大小,从扇区分配表中查找出该流文件所占用的扇区链,从短流扇区分配表中查找该短流文件所占用的扇区链。
将上述查找出的流文件(短流文件)所占用的扇区链,与上述恢复出来的流扇区分配表(或短流扇区分配表)中本身记载的相应的扇区链进行比较,以扇区链的较长者,即恢复的数据最大,作为上述流文件(或短流文件)所占用的最终扇区链。并根据该最终扇区链信息,对扇区分配表(或短流扇区分配表)及目录信息进行相应的修改,使两者保持一致。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
实施例二
该实施例提供的一种复合文档的修复装置的具体实现结构如图4所示,具体可以包括:
扇区类型判断模块41,用于根据扇区中存储的内容和预定的评价规则,对待修复的复合文档的各个扇区进行分析,分别判断出各个扇区的扇区类型;
恢复处理模块42,用于根据复合文档的存储结构和所述各个扇区的扇区类型,对所述复合文档进行恢复。
该实施例提供的另一种复合文档的修复装置的具体实现结构如图5所示,具体可以包括:
扇区类型判断模块51,用于根据扇区中存储的内容和预定的评价规则,对待修复的复合文档的各个扇区进行分析,分别判断出各个扇区的扇区类型;
恢复处理模块52,用于根据复合文档的存储结构和所述各个扇区的扇区类型,对所述复合文档进行恢复。
所述扇区类型判断模块具体包括:
扇区分配表和主扇区分配表判断模块511,用于获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于扇区分配表,在得到了所有属于扇区分配表的扇区后,再获取剩下的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表的评价规则,对所述剩下的扇区进行打分,依次遍历所述剩下的扇区中记录的所有扇区号并依次进行相应的打分,根据所述剩下的扇区的最后得分得到所述剩下的扇区属于主扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述剩下的扇区属于主扇区分配表,并保存所述剩下的扇区中记录的最大和最小的扇区号;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于主扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于主扇区分配表,并保存所述扇区中记录的最大和最小的扇区号;在得到了所有属于主扇区分配表的扇区后,再获取剩下的扇区中记录的扇区号信息,根据该扇区号信息和预定的扇区分配表的评价规则,对所述剩下的扇区进行打分,依次遍历所述剩下的扇区中记录的所有扇区号并依次进行相应的打分,根据所述剩下的扇区的最后得分得到所述剩下的扇区属于扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于扇区分配表;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表、扇区分配表的评价规则,对所述扇区分别进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分分别得到所述扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于P2,则判断所述扇区属于扇区分配表;如果P2大于P1,则判断所述扇区属于主扇区分配表;如果P2等于P1,并且P1大于预定的扇区分配表的判决值,P2不大于预定的主扇区分配表的判决值,则判断所述扇区属于扇区分配表;如果P2等于P1,并且P1不大于预定的扇区分配表的判决值,P2大于预定的主扇区分配表的判决值,则判断所述扇区属于主扇区分配表;如果P2等于P1,并且P1大于预定的扇区分配表的判决值,P2大于预定的主扇区分配表的判决值,则判断该扇区属于待确认的扇区;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表、扇区分配表的评价规则,分别对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分分别得到所述扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于预定的扇区分配表的判决值,而P2不大于预定的主扇区分配表的判决值,则判断该扇区属于扇区分配表;如果P1不大于预定的扇区分配表的判决值,而P2大于预定的主扇区分配表的判决值,则判断该扇区属于主扇区分配表;如果P1大于预定的扇区分配表的判决值,并且P2大于预定的主扇区分配表的判决值,此时,比较P1和P2的大小,如果P1大于P2,则判断该扇区属于扇区分配表;如果P2大于P1,则判断该扇区属于主扇区分配表。
所述扇区类型判断模块51还可以包括:
短流扇区分配表判断模块512,用于获取所述判断出的属于扇区分配表的扇区中记录的扇区号信息,根据该扇区号信息和预定的短流扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,当所述扇区的最后得分大于预定的判决值时,则判定所述扇区属于短流扇区分配表;根据所述判定的属于短流扇区分配表的扇区信息,对所述判断出的属于扇区分配表的扇区信息进行更正。
目录判断模块513,用于获取所述判断出的属于扇区分配表、主扇区分配表和短流扇区分配表的扇区之外剩下的扇区中记录的目录项信息,根据该目录项信息和预定的目录的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有目录项并依次进行相应的打分,当所述扇区的最后得分大于预定的判决值时,则判定所述扇区属于目录。
所述恢复处理模块具体包括:
主扇区分配表恢复模块521,用于从所述属于主扇区分配表的各个扇区中找出扇区号最小的扇区,作为主扇区分配表占用的第一个扇区,根据主扇区分配表的每个扇区最后四个字节存储下一个扇区号和主扇区分配表的扇区中存储的扇区号是升序的特征信息,以及所述保存的每个扇区中记录的最小和最大扇区号信息,恢复出主扇区分配表;
扇区分配表恢复模块522,用于根据所述主扇区分配表找到所有属于扇区分配表的扇区,根据扇区分配表和主扇区分配表的结构特征,将所述找到的所有属于扇区分配表的扇区与所述判断出的属于扇区分配表的各个扇区互相进行验证,排除无效的扇区。并且对所述待确认的扇区进行验证,判断出该待确认的扇区是属于扇区分配表或主扇区分配表。确定属于扇区分配表的最终的各个扇区,获取该最终的各个扇区中记录的扇区号信息,恢复出扇区分配表。
所述恢复处理模块还可以包括:
短流扇区分配表恢复模块523,用于从所述判断出的属于短流扇区分配表的各个扇区中找出扇区号最小的扇区,作为短流扇区分配表占用的第一个扇区,根据该第一个扇区从所述恢复出的扇区分配表中获取短流扇区分配表占用的扇区链,获取该扇区链中的各个扇区中记录的扇区号信息,恢复出短流扇区分配表;
目录恢复模块524,用于从所述判断出的属于目录的各个扇区中找出扇区号最小的扇区,作为目录占用的第一个扇区,根据该第一个扇区从扇区分配表中获取目录占用的扇区链,获取该扇区链中的各个扇区中记录的目录项信息,恢复出整个目录;获取所述目录所占用的扇区中记录的目录项信息,检查目录项中的数据的有效性,将数据为无效的目录项标记为错误节点;将每一个目录项作为一个节点,对整个目录进行逐层遍历;所述对整个目录的逐层遍历完成后,对未访问过且未标记为错误节点的节点***到根存储,该节点为丢失的数据;对标记为错误节点,并且占用的第一个扇区号及数据大小合法的目录项,通过所述扇区分配表进行修复;对标记为错误节点的剩余目录项数据进行清理,该节点为冗余或者垃圾数据,然后,重新生成整个复合文档的目录。
流文件和短流文件恢复模块525,用于遍历所述重新生成的目录中的目录项,根据目录项中记载的流文件或者短流文件占用的第一个扇区号,以及流文件或者短流文件的大小,从所述扇区分配表中查找出该流文件所占用的扇区链或者从所述短流扇区分配表中查找该短流文件所占用的扇区链;将所述查找出的流文件或短流文件所占用的扇区链,与所述流扇区分配表或短流扇区分配表中本身记载的相应的扇区链进行比较,将较长的扇区链的作为所述流文件或短流文件所占用的最终扇区链;根据所述流文件或短流文件所占用的最终扇区链信息,对扇区分配表或短流扇区、目录进行相应的修改,使扇区分配表或短流扇区、目录保持一致。
文件头恢复模块526,用于根据复合文档的文件头的结构特点,对所述待修复的复合文档的文件头进行恢复,获取恢复出的文件头中包含的关键信息,该关键信息包括扇区分配表占用的扇区数、目录占用的第一个扇区号、短流扇区分配表占用的第一个扇区号和占用的扇区数、主扇区分配表占用的第一个扇区号和占用的扇区数;
如果所述恢复出来的扇区分配表、主扇区分配表、短流扇区分配表和目录与所述文件头中包含的相关关键信息不一致,则对所述文件头中包含的相关关键信息进行修正。
综上所述,应用本发明实施例,可以对因软件异常或者操作***异常,病毒破坏,用户非法操作等原因而损坏的复合文档文件进行数据修复和文件结构的恢复,使得用户能够正常使用复合文档文件,并且最大程度恢复丢失和损坏的数据,减少用户和运营商的损失。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (14)
1、一种复合文档的修复方法,其特征在于,包括:
根据扇区中存储的内容和预定的评价规则,对待修复的复合文档的各个扇区进行分析,分别判断出各个扇区的扇区类型
根据复合文档的存储结构和所述各个扇区的扇区类型,对所述复合文档进行恢复。
2、根据权利要求1所述的方法,其特征在于,所述扇区类型包括:属于扇区分配表、主扇区分配表、短流扇区分配表或目录的扇区。
3、根据权利要求2所述的方法,其特征在于,所述分别判断出各个扇区的扇区类型的过程,具体包括:
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于扇区分配表,在得到了所有属于扇区分配表的扇区后,再获取剩下的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表的评价规则,对所述剩下的扇区进行打分,依次遍历所述剩下的扇区中记录的所有扇区号并依次进行相应的打分,根据所述剩下的扇区的最后得分得到所述剩下的扇区属于主扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述剩下的扇区属于主扇区分配表,并保存所述剩下的扇区中记录的最大和最小的扇区号;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于主扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于主扇区分配表,并保存所述扇区中记录的最大和最小的扇区号;在得到了所有属于主扇区分配表的扇区后,再获取剩下的扇区中记录的扇区号信息,根据该扇区号信息和预定的扇区分配表的评价规则,对所述剩下的扇区进行打分,依次遍历所述剩下的扇区中记录的所有扇区号并依次进行相应的打分,根据所述剩下的扇区的最后得分得到所述剩下的扇区属于扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于扇区分配表;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表、扇区分配表的评价规则,对所述扇区分别进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分分别得到所述扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于P2,则判断所述扇区属于扇区分配表;如果P2大于P1,则判断所述扇区属于主扇区分配表;如果P2等于P1,并且P1大于预定的扇区分配表的判决值,P2不大于预定的主扇区分配表的判决值,则判断所述扇区属于扇区分配表;如果P2等于P1,并且P1不大于预定的扇区分配表的判决值,P2大于预定的主扇区分配表的判决值,则判断所述扇区属于主扇区分配表;如果P2等于P1,并且P1大于预定的扇区分配表的判决值,P2大于预定的主扇区分配表的判决值,则判断该扇区属于待确认的扇区;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表、扇区分配表的评价规则,分别对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分分别得到所述扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于预定的扇区分配表的判决值,而P2不大于预定的主扇区分配表的判决值,则判断该扇区属于扇区分配表;如果P1不大于预定的扇区分配表的判决值,而P2大于预定的主扇区分配表的判决值,则判断该扇区属于主扇区分配表;如果P1大于预定的扇区分配表的判决值,并且P2大于预定的主扇区分配表的判决值,此时,比较P1和P2的大小,如果P1大于P2,则判断该扇区属于扇区分配表;如果P2大于P1,则判断该扇区属于主扇区分配表。
4、根据权利要求3所述的方法,其特征在于:
所述的扇区分配表的评价规则包括:
如果扇区中记录的扇区号大于等于0,小于最大扇区号,则给该扇区加2分,所述最大扇区号=(复合文档大小-512)/512);
如果扇区中记录的扇区号等于-3,-4,则给该扇区加2分;
如果扇区中记录的扇区号等于-1或-2,则给该扇区加1分;
如果扇区中记录的扇区号不属于大于等于0并且小于最大扇区号、等于-3或-4、等于-1或-2中的任一项,或者扇区中没有记录扇区号,则给该扇区减2分;
所述的主扇区分配表的评价规则包括:
如果扇区中记录的扇区号大于等于0,小于最大扇区号,则给该扇区加2分;
如果扇区中记录的扇区号等于-1但不全为-1,则给该扇区加1分;
如果扇区中记录的扇区号等于-2,并且-2之后的扇区号只能-1或者-2刚好是最后一个,则给该扇区加10分;
如果扇区中记录的扇区号不属于大于等于0并且小于最大扇区号、等于-1但不全为-1、等于-2并且-2之后的扇区号只能-1或者-2刚好是最后一个中的任一项,或者扇区中没有记录扇区号,则给该扇区减2分。
5、根据权利要求2所述的方法,其特征在于,所述分别判断出各个扇区的扇区类型的过程,还包括:
获取所述判断出的属于扇区分配表的扇区中记录的扇区号信息,根据该扇区号信息和预定的短流扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于短流扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于短流扇区分配表;根据所述判定的属于短流扇区分配表的扇区信息,对所述判断出的属于扇区分配表的扇区信息进行更正;
获取所述判断出的属于扇区分配表、主扇区分配表和短流扇区分配表的扇区之外剩下的扇区中记录的目录项信息,根据该目录项信息和预定的目录的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有目录项并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于目录的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于目录。
6、根据权利要求5所述的方法,其特征在于:
所述短流扇区分配表的评价规则包括:
如果扇区中记录的扇区号大于等于0,小于最大扇区号,则给该扇区加2分;
如果扇区中记录的扇区号等于-1或-2,则给该扇区加1分;
如果扇区中记录的扇区号不属于大于等于0并且小于最大扇区号、等于-1或-2中的任一项,或者扇区中没有记录扇区号,则给该扇区减2分。
所述目录的评价规则包括:
如果扇区中记录的目录项的名称的长度,以及该名称本身有效,则给该扇区加16分,否则该扇区减16分;
如果扇区中记录的目录项的类型为合法,则该扇区加16分,否则给该扇区减16分;
如果扇区中记录的流文件或者短流文件的第一个扇区的扇区号小于最大扇区号,则给扇区加16分,否则给扇区减16分;
如果扇区中记录的目录项的大小为合法,则给扇区加16分,否则给扇区减16分。
7、根据权利要求2至6任一项所述的方法,其特征在于,所述根据复合文档的存储结构和所述各个扇区的扇区类型,对所述复合文档进行恢复的过程,具体包括:
从所述属于主扇区分配表的各个扇区中找出扇区号最小的扇区,作为主扇区分配表占用的第一个扇区,根据主扇区分配表的每个扇区最后四个字节存储下一个扇区号和主扇区分配表的扇区中存储的扇区号是升序的特征信息,以及所述保存的每个扇区中记录的最小和最大扇区号信息,恢复出主扇区分配表;
根据所述主扇区分配表找到所有属于扇区分配表的扇区,根据扇区分配表和主扇区分配表的结构特征,将所述找到的属于扇区分配表的各个扇区与所述判断出的属于扇区分配表的各个扇区互相进行验证,排除无效的扇区,并且对所述待确认的扇区进行验证,判断出该待确认的扇区是属于扇区分配表或主扇区分配表,确定属于扇区分配表的最终的各个扇区,获取该最终的各个扇区中记录的扇区号信息,恢复出扇区分配表。
8、根据权利要求7所述的方法,其特征在于,所述根据复合文档的存储结构和所述各个扇区的扇区类型,对所述复合文档进行恢复的过程,还包括:
从所述判断出的属于短流扇区分配表的各个扇区中找出扇区号最小的扇区,作为短流扇区分配表占用的第一个扇区,根据该第一个扇区从所述恢复出的扇区分配表中获取短流扇区分配表占用的扇区链,获取该扇区链中的各个扇区中记录的扇区号信息,恢复出短流扇区分配表;
从所述判断出的属于目录的各个扇区中找出扇区号最小的扇区,作为目录占用的第一个扇区,根据该第一个扇区从扇区分配表中获取目录占用的扇区链,获取该扇区链中的各个扇区中记录的目录项信息,恢复出整个目录;获取所述目录所占用的扇区中记录的目录项信息,检查目录项中的数据的有效性,将数据为无效的目录项标记为错误节点;将每一个目录项作为一个节点,对整个目录进行逐层遍历;所述对整个目录的逐层遍历完成后,对未访问过且未标记为错误节点的节点***到根存储,该节点为丢失的数据;对标记为错误节点,并且占用的第一个扇区号及数据大小合法的目录项,通过所述扇区分配表进行修复;对标记为错误节点的剩余目录项数据进行清理,该节点为冗余或者垃圾数据,然后,重新生成整个复合文档的目录;
遍历所述重新生成的目录中的目录项,根据目录项中记载的流文件或者短流文件占用的第一个扇区号,以及流文件或者短流文件的大小,从所述扇区分配表中查找出该流文件所占用的扇区链或者从所述短流扇区分配表中查找该短流文件所占用的扇区链;将所述查找出的流文件或短流文件所占用的扇区链,与所述流扇区分配表或短流扇区分配表中本身记载的相应的扇区链进行比较,将较长的扇区链的作为所述流文件或短流文件所占用的最终扇区链。
9、根据权利要求8所述的方法,其特征在于,所述方法还包括:
根据复合文档的文件头的结构特点,对所述待修复的复合文档的文件头进行恢复,获取恢复出的文件头中包含的关键信息,该关键信息包括扇区分配表占用的扇区数、目录占用的第一个扇区号、短流扇区分配表占用的第一个扇区号和占用的扇区数、主扇区分配表占用的第一个扇区号和占用的扇区数;
如果所述恢复出来的扇区分配表、主扇区分配表、短流扇区分配表和目录与所述恢复出的文件头中包含的相关关键信息不一致,则对所述文件头中包含的相关关键信息进行修正。
10、一种复合文档的修复装置,其特征在于,包括:
扇区类型判断模块,用于根据扇区中存储的内容和预定的评价规则,对待修复的复合文档的各个扇区进行分析,分别判断出各个扇区的扇区类型;
恢复处理模块,用于根据复合文档的存储结构和所述各个扇区的扇区类型,对所述复合文档进行恢复。
11、根据权利要求10所述的装置,其特征在于,所述扇区类型判断模块具体包括:
扇区分配表和主扇区分配表判断模块,用于获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于扇区分配表,在得到了所有属于扇区分配表的扇区后,再获取剩下的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表的评价规则,对所述剩下的扇区进行打分,依次遍历所述剩下的扇区中记录的所有扇区号并依次进行相应的打分,根据所述剩下的扇区的最后得分得到所述剩下的扇区属于主扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述剩下的扇区属于主扇区分配表,并保存所述剩下的扇区中记录的最大和最小的扇区号;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分得到所述扇区属于主扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于主扇区分配表,并保存所述扇区中记录的最大和最小的扇区号;在得到了所有属于主扇区分配表的扇区后,再获取剩下的扇区中记录的扇区号信息,根据该扇区号信息和预定的扇区分配表的评价规则,对所述剩下的扇区进行打分,依次遍历所述剩下的扇区中记录的所有扇区号并依次进行相应的打分,根据所述剩下的扇区的最后得分得到所述剩下的扇区属于扇区分配表的概率值,当该概率值大于预定的判决值时,则判定所述扇区属于扇区分配表;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表、扇区分配表的评价规则,对所述扇区分别进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分分别得到所述扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于P2,则判断所述扇区属于扇区分配表;如果P2大于P1,则判断所述扇区属于主扇区分配表;如果P2等于P1,并且P1大于预定的扇区分配表的判决值,P2不大于预定的主扇区分配表的判决值,则判断所述扇区属于扇区分配表;如果P2等于P1,并且P1不大于预定的扇区分配表的判决值,P2大于预定的主扇区分配表的判决值,则判断所述扇区属于主扇区分配表;如果P2等于P1,并且P1大于预定的扇区分配表的判决值,P2大于预定的主扇区分配表的判决值,则判断该扇区属于待确认的扇区;
或者,
获取所述待修复的复合文档的扇区中记录的扇区号信息,根据该扇区号信息和预定的主扇区分配表、扇区分配表的评价规则,分别对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,根据所述扇区的最后得分分别得到所述扇区属于扇区分配表的概率P1和属于主扇区分配表的概率P2,如果P1大于预定的扇区分配表的判决值,而P2不大于预定的主扇区分配表的判决值,则判断该扇区属于扇区分配表;如果P1不大于预定的扇区分配表的判决值,而P2大于预定的主扇区分配表的判决值,则判断该扇区属于主扇区分配表;如果P1大于预定的扇区分配表的判决值,并且P2大于预定的主扇区分配表的判决值,此时,比较P1和P2的大小,如果P1大于P2,则判断该扇区属于扇区分配表;如果P2大于P1,则判断该扇区属于主扇区分配表。
12、根据权利要求11所述的装置,其特征在于,所述扇区类型判断模块还包括:
短流扇区分配表判断模块,用于获取所述判断出的属于扇区分配表的扇区中记录的扇区号信息,根据该扇区号信息和预定的短流扇区分配表的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有扇区号并依次进行相应的打分,当所述扇区的最后得分大于预定的判决值时,则判定所述扇区属于短流扇区分配表;根据所述判定的属于短流扇区分配表的扇区信息,对所述判断出的属于扇区分配表的扇区信息进行更正。
目录判断模块,用于获取所述判断出的属于扇区分配表、主扇区分配表和短流扇区分配表的扇区之外剩下的扇区中记录的目录项信息,根据该目录项信息和预定的目录的评价规则,对所述扇区进行打分,依次遍历所述扇区中记录的所有目录项并依次进行相应的打分,当所述扇区的最后得分大于预定的判决值时,则判定所述扇区属于目录。
13、根据权利要求10至12任一项所述的装置,其特征在于,所述恢复处理模块具体包括:
主扇区分配表恢复模块,用于从所述属于主扇区分配表的各个扇区中找出扇区号最小的扇区,作为主扇区分配表占用的第一个扇区,根据主扇区分配表的每个扇区最后四个字节存储下一个扇区号和主扇区分配表的扇区中存储的扇区号是升序的特征信息,以及所述保存的每个扇区中记录的最小和最大扇区号信息,恢复出主扇区分配表;
扇区分配表恢复模块,用于根据所述主扇区分配表找到所有属于扇区分配表的扇区,根据扇区分配表和主扇区分配表的结构特征,将所述找到的所有属于扇区分配表的扇区与所述判断出的属于扇区分配表的各个扇区互相进行验证,排除无效的扇区,并且对所述待确认的扇区进行验证,判断出该待确认的扇区是属于扇区分配表或主扇区分配表,确定属于扇区分配表的最终的各个扇区,获取该最终的各个扇区中记录的扇区号信息,恢复出扇区分配表。
14、根据权利要求13所述的装置,其特征在于,所述恢复处理模块还包括:
短流扇区分配表恢复模块,用于从所述判断出的属于短流扇区分配表的各个扇区中找出扇区号最小的扇区,作为短流扇区分配表占用的第一个扇区,根据该第一个扇区从所述恢复出的扇区分配表中获取短流扇区分配表占用的扇区链,获取该扇区链中的各个扇区中记录的扇区号信息,恢复出短流扇区分配表;
目录恢复模块,用于从所述判断出的属于目录的各个扇区中找出扇区号最小的扇区,作为目录占用的第一个扇区,根据该第一个扇区从扇区分配表中获取目录占用的扇区链,获取该扇区链中的各个扇区中记录的目录项信息,恢复出整个目录;获取所述目录所占用的扇区中记录的目录项信息,检查目录项中的数据的有效性,将数据为无效的目录项标记为错误节点;将每一个目录项作为一个节点,对整个目录进行逐层遍历;所述对整个目录的逐层遍历完成后,对未访问过且未标记为错误节点的节点***到根存储,该节点为丢失的数据;对标记为错误节点,并且占用的第一个扇区号及数据大小合法的目录项,通过所述扇区分配表进行修复;对标记为错误节点的剩余目录项数据进行清理,该节点为冗余或者垃圾数据,然后,重新生成整个复合文档的目录。
流文件和短流文件恢复模块,用于遍历所述重新生成的目录中的目录项,根据目录项中记载的流文件或者短流文件占用的第一个扇区号,以及流文件或者短流文件的大小,从所述扇区分配表中查找出该流文件所占用的扇区链或者从所述短流扇区分配表中查找该短流文件所占用的扇区链;将所述查找出的流文件或短流文件所占用的扇区链,与所述流扇区分配表或短流扇区分配表中本身记载的相应的扇区链进行比较,将较长的扇区链的作为所述流文件或短流文件所占用的最终扇区链;根据所述流文件或短流文件所占用的最终扇区链信息,对扇区分配表或短流扇区、目录进行相应的修改,使扇区分配表或短流扇区、目录保持一致;
文件头恢复模块,用于根据复合文档的文件头的结构特点,对所述待修复的复合文档的文件头进行恢复,获取恢复出的文件头中包含的关键信息,该关键信息包括扇区分配表占用的扇区数、目录占用的第一个扇区号、短流扇区分配表占用的第一个扇区号和占用的扇区数、主扇区分配表占用的第一个扇区号和占用的扇区数;
如果所述恢复出来的扇区分配表、主扇区分配表、短流扇区分配表和目录与所述文件头中包含的相关关键信息不一致,则对所述文件头中包含的相关关键信息进行修正。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008101199801A CN101414299B (zh) | 2008-10-20 | 2008-10-20 | 复合文档的修复方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008101199801A CN101414299B (zh) | 2008-10-20 | 2008-10-20 | 复合文档的修复方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101414299A true CN101414299A (zh) | 2009-04-22 |
CN101414299B CN101414299B (zh) | 2011-08-10 |
Family
ID=40594836
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008101199801A Active CN101414299B (zh) | 2008-10-20 | 2008-10-20 | 复合文档的修复方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101414299B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102073682A (zh) * | 2010-12-21 | 2011-05-25 | 厦门市美亚柏科信息股份有限公司 | 一种基于编码方式的文档数据恢复***及其快速恢复方法 |
CN102122284A (zh) * | 2010-01-08 | 2011-07-13 | 腾讯科技(深圳)有限公司 | 一种复合文档存储、读写方法和装置 |
CN107122433A (zh) * | 2017-04-18 | 2017-09-01 | 广州视源电子科技股份有限公司 | 一种复合文档的合并方法及实现该方法的*** |
CN109145602A (zh) * | 2018-07-06 | 2019-01-04 | 成都亚信网络安全产业技术研究院有限公司 | 一种勒索软件攻击的防护方法及装置 |
CN112612756A (zh) * | 2020-12-21 | 2021-04-06 | 北京鸿腾智能科技有限公司 | 异常文件的修复方法、装置、设备及存储介质 |
-
2008
- 2008-10-20 CN CN2008101199801A patent/CN101414299B/zh active Active
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102122284A (zh) * | 2010-01-08 | 2011-07-13 | 腾讯科技(深圳)有限公司 | 一种复合文档存储、读写方法和装置 |
WO2011082622A1 (zh) * | 2010-01-08 | 2011-07-14 | 腾讯科技(深圳)有限公司 | 复合文档存储、读写方法和装置 |
CN102122284B (zh) * | 2010-01-08 | 2014-07-02 | 腾讯科技(深圳)有限公司 | 一种复合文档存储、读写方法和装置 |
US8788784B2 (en) | 2010-01-08 | 2014-07-22 | Tencent Technology (Shenzhen) Company Limited | Method and device for storing and reading/writing composite document |
RU2525752C2 (ru) * | 2010-01-08 | 2014-08-20 | Тенсент Текнолоджи (Шэньчжэнь) Компани Лимитед | Способ и устройство хранения, чтения и записи составного документа |
CN102073682A (zh) * | 2010-12-21 | 2011-05-25 | 厦门市美亚柏科信息股份有限公司 | 一种基于编码方式的文档数据恢复***及其快速恢复方法 |
CN102073682B (zh) * | 2010-12-21 | 2012-11-21 | 厦门市美亚柏科信息股份有限公司 | 一种基于编码方式的文档数据恢复***及其快速恢复方法 |
CN107122433A (zh) * | 2017-04-18 | 2017-09-01 | 广州视源电子科技股份有限公司 | 一种复合文档的合并方法及实现该方法的*** |
CN107122433B (zh) * | 2017-04-18 | 2020-07-24 | 广州视源电子科技股份有限公司 | 一种复合文档的合并方法及实现该方法的*** |
CN109145602A (zh) * | 2018-07-06 | 2019-01-04 | 成都亚信网络安全产业技术研究院有限公司 | 一种勒索软件攻击的防护方法及装置 |
CN109145602B (zh) * | 2018-07-06 | 2020-06-02 | 成都亚信网络安全产业技术研究院有限公司 | 一种勒索软件攻击的防护方法及装置 |
CN112612756A (zh) * | 2020-12-21 | 2021-04-06 | 北京鸿腾智能科技有限公司 | 异常文件的修复方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN101414299B (zh) | 2011-08-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6185569B1 (en) | Linked data structure integrity verification system which verifies actual node information with expected node information stored in a table | |
Ambekar et al. | Canonical numbering of kinematic chains and isomorphism problem: min code | |
CN101464900B (zh) | Ntfs文件***下轻量级文件隐藏方法 | |
Aoe | An efficient digital search algorithm by using a double-array structure | |
US8959125B2 (en) | File system having inverted hierarchical structure | |
US20070005874A1 (en) | File system storing transaction records in flash-like media | |
CN108345468B (zh) | 基于树和序列相似度的编程语言代码查重方法 | |
CN101414299A (zh) | 复合文档的修复方法和装置 | |
CN107609350A (zh) | 一种二代测序数据分析平台的数据处理方法 | |
CN107678748A (zh) | 一种源代码文件编译方法及装置 | |
CN105446705A (zh) | 用于确定配置文件的特性的方法和装置 | |
CN110515543B (zh) | 基于对象存储桶的快照方法、装置和*** | |
CN104077078B (zh) | 读存储区、更新存储区的方法及装置 | |
CN106775481A (zh) | 数据读取方法及设备 | |
CN101853260B (zh) | 检测电子邮件内容包含的***和方法 | |
US7693850B2 (en) | Method and apparatus for adding supplemental information to PATRICIA tries | |
CN106557572A (zh) | 一种安卓应用程序文件的提取方法及*** | |
CN103412802B (zh) | 容灾数据文件访问控制列表备份的方法及装置 | |
CN103294735B (zh) | 基于tcam的确定性有穷状态自动机dfa的匹配方法和装置 | |
CN112286720B (zh) | Sm2246en主控的固态硬盘启用trim命令后提取被删除数据的方法 | |
CN108021472A (zh) | ReFS文件***的格式化恢复方法及存储介质 | |
CN113721889A (zh) | 需求追踪关系构建方法、装置及计算机可读存储介质 | |
JPH0218652A (ja) | データ集信方式 | |
CN104021142B (zh) | 防篡改***网页文件指纹的存储和查询方法 | |
US20090043770A1 (en) | Method of Realizing Commands Synchronization in Supporting Multi-Threading Non-Volitale Memory File System |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |