著录项信息
专利名称 | 一种增量同步的方法、装置及系统 |
申请号 | CN201210157295.4 | 申请日期 | 2012-05-18 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2013-12-04 | 公开/公告号 | CN103428242A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | H04L29/08 | IPC分类号 | H;0;4;L;2;9;/;0;8查看分类表>
|
申请人 | 阿里巴巴集团控股有限公司 | 申请人地址 | 英属开曼群岛大开曼岛资本大厦一座四层847号邮箱
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 阿里巴巴集团控股有限公司 | 当前权利人 | 阿里巴巴集团控股有限公司 |
发明人 | 王含章;翁磊;曹高挺 |
代理机构 | 北京同达信恒知识产权代理有限公司 | 代理人 | 郭润湘 |
摘要
本申请公开了一种增量同步的方法、装置及系统,用以解决现有技术中的增量同步方法应用于分布式存储场景中会使服务器压力过大的问题。该方法客户端在检测到自身存在新增的文件时,将该文件分割成若干个文件块,确定各文件块的弱校验值和强校验值,将确定的弱校验值和强校验值记录在相应的文件块对应的文件块结构表中,将各文件块的文件块结构表作为该文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器存储。通过上述方法,在后续的增量同步过程中,如果服务器中保存的该文件是旧文件,则服务器无需计算各文件块的弱校验值和强校验值,直接从各文件块结构表中提取相应各文件块的弱校验值和强校验值即可,因此减轻了服务器的负担。
1.一种增量同步的方法,其特征在于,包括:
客户端在检测到自身存在新增的文件时,将所述文件分割成连续、不重叠的文件块,除最后一个文件块之外,其余文件块的长度为固定长度,并且最后一个文件块的长度不大于所述固定长度;
所述客户端分别针对分割的每个文件块,确定该文件块的弱校验值和强校验值,并生成该文件块对应的文件块结构表,生成的文件块结构表中记录了该文件块的弱校验值和强校验值;
所述客户端将各文件块结构表作为所述文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器进行存储;
所述客户端在检测到自身保存的所述文件被更新时,将自身保存的更新后的文件作为更新文件,获取服务器中保存的所述更新文件对应的原文件的文件结构列表,提取所述原文件的文件结构列表中的每个文件块结构表;
将所述更新文件的第一个字节确定为起点,确定从所述起点开始的固定长度的文件块为待匹配块,确定所述待匹配块的弱校验值和强校验值;
若判断出提取的每个文件块结构表中是否存在至少一个与所述待匹配块匹配的文件块结构表,则生成所述待匹配块的文件块结构表,将生成的文件块结构表中的上传标记设置为不上传,并插入到所述更新文件的文件结构列表中的末尾,将所述更新文件中所述待匹配块的下一个字节重新确定为起点,其中,与所述待匹配块匹配的文件块结构表为:记录的弱校验值与所述待匹配块的弱校验值匹配,且,记录的强校验值与所述待匹配块的强校验值匹配的文件块结构表;
将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,继续判断提取的每个文件块结构表中是否存在至少一个与重新确定的待匹配块匹配的文件块结构表,直至将所述更新文件中所有文件块的文件块结构表插入到所述更新文件的文件结构列表中为止;
将所述更新文件的文件结构列表发送给所述服务器保存,以更新所述服务器中保存的所述原文件的文件结构列表,并将所述更新文件的文件结构列表中每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储,完成所述更新文件的同步。
2.如权利要求1所述的方法,其特征在于,所述客户端将各文件块结构表作为所述文件的文件结构列表发送给服务器保存之前,所述方法还包括:
为分割的每个文件块分配文件块标识;
针对每个文件块,根据分割的各文件块在所述文件中的排序顺序,确定与该文件块相邻且排在该文件块之前的前继文件块的文件块标识,确定与文件块相邻且排在该文件块之后的后继文件块的文件块标识,将该文件块的文件块标识、确定的前继文件块的文件块标识、后继文件块的文件块标识记录在该文件块对应的文件块结构表中。
3.如权利要求1或2所述的方法,其特征在于,所述客户端将各文件块结构表作为所述文件的文件结构列表发送给服务器保存,具体包括:
按照每个文件块在所述文件中的排序顺序,将每个文件块对应的文件块结构表进行排序;
将排序后的各文件块结构表作为所述文件的文件结构列表发送给服务器保存。
4.如权利要求3所述的方法,其特征在于,将排序后的各文件块结构表作为所述文件的文件结构列表发送给服务器保存之前,所述方法还包括:
将每个文件块结构表中的上传标记设置为上传;
将各文件块发送给服务器进行存储,具体包括:
将每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储。
5.如权利要求4所述的方法,其特征在于,将每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储之前,所述方法还包括:
所述客户端接收所述服务器返回的调整后的文件结构列表,其中,所述服务器调整文件结构列表具体包括:针对接收到的所述文件结构列表中的每个文件块结构表,根据该文件块结构表中记录的强校验值,判断所述服务器自身是否已经保存了相同强校验值的文件块,当判断结果为是时,将该文件块结构表中的上传标记调整为不上传;
将每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储,具体包括:
根据所述服务器返回的调整后的文件结构列表中每个文件块结构表的文件块上传标记,将上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储。
6.如权利要求4所述的方法,其特征在于,将每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储之前,所述方法还包括:
确定所述文件的文件校验值并发送给所述服务器;
接收所述服务器返回的调整后的文件结构列表,其中,所述服务器调整文件结构列表具体包括:根据所述文件的文件校验值,判断所述服务器自身是否已经保存了相同文件校验值的文件,若是,则提取保存的具有所述文件校验值的文件的文件结构列表,将提取的文件结构列表中的每个文件块结构表中包含的上传标记调整为不上传,并作为调整后的文件结构列表,否则,针对所述客户端发送的文件结构列表中的每个文件块结构表,根据该文件块结构表中包含的强校验值,判断所述服务器自身是否已经保存了相同强校验值的文件块,当判断结果为是时,将该文件块结构表中包含的上传标记调整为不上传;
将每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储,具体包括:
根据所述服务器返回的调整后的文件结构列表中每个文件块结构表的上传标记,将上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储。
7.如权利要求1所述的方法,其特征在于,若判断出提取的每个文件块结构表中不存在至少一个与所述待匹配块匹配的文件块结构表,则确定当前所述更新文件的文件结构列表中排在末尾的文件块结构表对应的文件块的最后一个字节,判断从确定的最后一个字节的下一个字节到所述起点的长度是否达到所述固定长度,若达到,则生成确定的最后一个字节的下一个字节到所述起点的文件块的文件块结构表,将生成的文件块结构表中的上传标记设置为上传,并插入到所述更新文件的文件结构列表中的末尾,将所述更新文件中所述起点的下一个字节重新确定为起点,若未达到,则将所述更新文件中所述起点的下一个字节重新确定为起点。
8.如权利要求7所述的方法,其特征在于,当将所述更新文件的第一个字节确定为起点,确定从所述起点开始的固定长度的文件块为待匹配块时,以及,当将所述更新文件中所述待匹配块的下一个字节重新确定为起点,将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块时,确定待匹配块的弱校验值具体包括:
采用公式 确定待匹配块的弱校验值的低16位,其中,k表示所述
更新文件的第k个字节为待匹配块的起点,l表示所述更新文件的第l个字节为待匹配块的最后一个字节,Xi为所述更新文件中的第i个字节,a(k,l)为确定的待匹配块的弱校验值的低16位;
采用公式 确定待匹配块的弱校验值的高16位,其中,b(k,
l)为确定的待匹配块的弱校验值的高16位;
根据确定的待匹配块的弱校验值的低16位和高16位,采用公式s(k,l)=a(k,l)+216b(k,l)确定待匹配块的弱校验值,其中,s(k,l)为确定的待匹配块的弱校验值;
当将所述更新文件中所述起点的下一个字节重新确定为起点,将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块时,确定重新确定的待匹配块的弱校验值具体包括:
采用公式a(k+1,l+1)=(a(k,l)-Xk+Xl+1)mod216确定重新确定的待匹配块的弱校验值的低16位,其中,k+1表示所述更新文件的第k+1个字节为重新确定的待匹配块的起点,l+1表示所述更新文件的第l+1个字节为重新确定的待匹配块的最后一个字节,a(k+1,l+1)为重新确定的待匹配块的弱校验值的低16位;
采用公式b(k+1,l+1)=(b(k,l)-(l-k+1)Xk+a(k+1,l+1))mod216确定重新确定的待匹配块的弱校验值的高16位,其中,b(k+1,l+1)为重新确定的待匹配块的弱校验值的高16位;
16
采用公式s(k+1,l+1)=a(k+1,l+1)+2 b(k+1,l+1)确定重新确定的待匹配块的弱校验值,其中,s(k+1,l+1)为重新确定的待匹配块的弱校验值。
9.如权利要求7所述的方法,其特征在于,生成所述待匹配块的文件块结构表,具体包括:
为所述待匹配块分配文件块标识;
根据当前所述更新文件的文件结构列表中排在末尾的文件块结构表,确定排在末尾的文件块结构表对应的文件块的文件块标识,作为所述待匹配块的前继文件块的文件块标识;
将确定所述待匹配块时所基于的起点作为所述待匹配块的起始位置;
生成包含所述待匹配块的文件块标识、前继文件块的文件块标识、起始位置、长度、弱校验值和强校验值的文件块结构表;
将生成的所述待匹配块的文件块结构表插入到所述更新文件的文件结构列表中的末尾之后,所述方法还包括:
将当前所述更新文件的文件结构列表中所述待匹配块的文件块结构表的前一个文件块结构表中的后继文件块的文件块标识修改为所述待匹配块的文件块标识。
10.如权利要求9所述的方法,其特征在于,针对确定的待匹配块,当判断存在至少一个与所述待匹配块匹配的文件块结构表时,在将生成的待匹配块的文件块结构表插入到所述更新文件的文件结构列表中的末尾之后,将所述更新文件中所述待匹配块的下一个字节重新确定为起点之前,所述方法还包括:
根据当前所述更新文件的文件结构列表中所述待匹配块的文件块结构表的前一个文件块结构表,确定所述前一个文件块结构表对应的文件块;
如果所述待匹配块与所述前一个文件块结构表对应的文件块之间存在一个长度小于所述固定长度的文件块,则确定该长度小于所述固定长度的文件块的弱校验值和强校验值;
判断提取的每个文件块结构表中是否存在至少一个与该长度小于所述固定长度的文件块匹配的文件块结构表,若是,则生成该长度小于所述固定长度的文件块的文件块结构表,将生成的文件块结构表中的上传标记设置为不上传,并插入到所述更新文件的文件结构列表中所述前一个文件块结构表和所述待匹配块的文件块结构表之间,否则,生成该长度小于所述固定长度的文件块的文件块结构表,将生成的文件块结构表中的上传标记设置为上传,并插入到所述更新文件的文件结构列表中所述前一个文件块结构表和所述待匹配块的文件块结构表之间。
11.如权利要求10所述的方法,其特征在于,生成该长度小于所述固定长度的文件块的文件块结构表,具体包括:
为该长度小于所述固定长度的文件块分配文件块标识;
确定所述前一个文件块结构表对应的文件块的文件块标识,作为该长度小于所述固定长度的文件块的前继文件块的文件块标识;
确定所述待匹配块的文件块标识,作为该长度小于所述固定长度的文件块的后继文件块的文件块标识;
将所述前一个文件块结构表对应的文件块的最后一个字节的下一个字节作为该长度小于所述固定长度的文件块的起始位置;
生成包含该长度小于所述固定长度的文件块的文件块标识、前继文件块的文件块标识、后继文件块的文件块标识、起始位置、长度、弱校验值和强校验值的文件块结构表;
将生成的该长度小于所述固定长度的文件块的文件块结构表插入到所述更新文件的文件结构列表中所述前一个文件块结构表和所述待匹配块的文件块结构表之间后,所述方法还包括:
将所述前一个文件块结构表中的后继文件块的文件块标识修改为该长度小于所述固定长度的文件块的文件块标识,将所述待匹配块的文件块结构表中的前继文件块的文件块标识修改为该长度小于所述固定长度的文件块的文件块标识。
12.如权利要求9所述的方法,其特征在于,当判断提取的每个文件块结构表中存在至少一个与所述待匹配块匹配的文件块结构表时,生成所述待匹配块的文件块结构表,具体包括:
按照该至少一个与所述待匹配块匹配的文件块结构表在所述原文件的文件结构列表中的排序顺序,在至少一个与所述待匹配块匹配的文件块结构表中,依次查找未建立匹配关系的文件块结构表,建立查找到的第一个文件块结构表与所述待匹配块的匹配关系;
当与所述待匹配块具有匹配关系的文件块结构表中包含的前继文件块的文件块标识,与生成的所述待匹配块的文件块结构表中的前继文件块的文件块标识相同时,将生成的所述待匹配块的文件块结构表的操作状态设置为完成状态;
当与所述待匹配块具有匹配关系的文件块结构表中包含的前继文件块的文件块标识,与生成的所述待匹配块的文件块结构表中的前继文件块的文件块标识不同时,将生成的所述待匹配块的文件块结构表的操作状态设置为移动状态;
当在该至少一个与所述待匹配块匹配的文件块结构表中未查找到未建立匹配关系的文件块结构表时,将生成的所述待匹配块的文件块结构表的操作状态设置为插入状态;
当判断提取的每个文件块结构表中不存在至少一个与所述待匹配块匹配的文件块结构表时,生成确定的最后一个字节的下一个字节到所述起点的文件块的文件块结构表,具体包括:
将生成的文件块结构表的操作状态设置为插入状态。
13.如权利要求12所述的方法,其特征在于,将所述更新文件的文件结构列表发送给所述服务器保存之前,所述方法还包括:
在提取的所述原文件的文件结构列表中的每个文件块结构表中,确定未建立匹配关系的文件块结构表;
将未建立匹配关系的文件块结构表中的操作状态设置为删除状态;
将所述更新文件的文件结构列表发送给所述服务器保存,以更新所述服务器中保存的所述原文件的文件结构列表,具体包括:
将所述更新文件的文件结构列表以及所述原文件的文件结构列表中操作状态为删除状态的文件块结构表发送给所述服务器,使服务器根据接收到的各文件块结构表的操作状态更新所述原文件的文件结构列表,其中,所述服务器针对操作状态为完成状态的文件块结构表,对所述原文件的相应文件块结构表不做任何操作,针对操作状态为插入状态的文件块结构表,将该操作状态为插入状态的文件块结构表插入到所述原文件的文件结构列表中,针对操作状态为移动状态的文件块结构表,调整所述原文件的相应文件块结构表在所述原文件的文件结构列表中的位置,针对操作状态为删除状态的文件块结构表,删除所述原文件的文件结构列表中相应的文件块结构表。
14.如权利要求3所述的方法,其特征在于,将各文件块发送给服务器进行存储之后,所述方法还包括:
客户端在检测到服务器中保存的所述文件被更新时,将自身保存的所述文件作为原文件,获取服务器中保存的所述原文件对应的更新文件的文件结构列表,并提取所述客户端自身保存的所述原文件的文件结构列表;
将提取的所述原文件的文件结构列表中的每个文件块结构表作为每个待匹配表,针对每个待匹配表,在所述更新文件的文件结构列表中查找与该待匹配表匹配的文件块结构表,其中,与该待匹配表匹配的文件块结构表为:记录的弱校验值与该待匹配表记录的弱校验值匹配,且,记录的强校验值与该待匹配表记录的强校验值匹配的文件块结构表;
将查找到的与该待匹配表匹配的文件块结构表标记为已匹配,并将与该待匹配表对应的所述原文件的文件块写入到新建存储区域中;
将所述更新文件的文件结构列表中未标记为已匹配的文件块结构表返回所述服务器,并接收所述服务器发送的各未标记为已匹配的文件块结构表对应的文件块,根据所述新建存储区域中写入的文件块和接收到的服务器发送的文件块更新所述原文件。
15.如权利要求14所述的方法,其特征在于,在所述更新文件的文件结构列表中查找到与该待匹配表匹配的文件块结构表,具体包括:
在所述更新文件的文件结构列表中查找到记录的弱校验值与该待匹配表记录的弱校验值匹配,且,记录的强校验值与该待匹配表记录的强校验值匹配,且,未标记为已匹配的文件块结构表。
16.如权利要求14所述的方法,其特征在于,将所述更新文件的文件结构列表中未标记为已匹配的文件块结构表返回所述服务器之前,所述方法还包括:
确定所述原文件中除了写入到所述新建存储区域中的文件块之外的各文件块,将确定的各文件块按照所述各文件块在所述原文件中的排序顺序进行前后拼接,得到拼接文件;
将所述拼接文件的第一个字节确定为起点,确定从所述起点开始的固定长度的文件块为待匹配块,确定所述待匹配块的弱校验值和强校验值;
判断所述更新文件的文件结构列表中是否存在至少一个与所述待匹配块匹配的文件块结构表,其中,与所述待匹配块匹配的文件块结构表为:记录的弱校验值与所述待匹配块的弱校验值匹配,且,记录的强校验值与所述待匹配块的强校验值匹配的文件块结构表;
若是,则将所述待匹配块写入到新建存储区域中,并将与该待匹配块匹配的文件块结构表标记为已匹配,将所述拼接文件中所述待匹配块的下一个字节重新确定为起点;
否则,将所述拼接文件中所述起点的下一个字节重新确定为起点;
将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,并继续判断所述更新文件的文件结构列表中是否存在至少一个与重新确定的待匹配块匹配的文件块结构表,直至得到所述拼接文件的最后一个字节所在的待匹配块的判断结果并执行相应操作为止。
17.如权利要求16所述的方法,其特征在于,针对当前确定的待匹配块,当判断存在至少一个与当前确定的待匹配块匹配的文件块结构表时,将所述拼接文件中当前确定的待匹配块的下一个字节重新确定为起点之前,所述方法还包括:
确定所述拼接文件中上一个被写入到所述新建存储区域中的待匹配块;
如果所述拼接文件中所述当前确定的待匹配块与上一个被写入到所述新建存储区域中的待匹配块之间存在一个长度小于所述固定长度的文件块,则确定该长度小于所述固定长度的文件块的弱校验值和强校验值;
当所述更新文件的文件结构列表中存在至少一个与该长度小于所述固定长度的文件块匹配的文件块结构表时,将该长度小于所述固定长度的文件块写入到新建存储区域中,并将与该长度小于所述固定长度的文件块匹配的文件块结构表标记为已匹配。
18.如权利要求16所述的方法,其特征在于,确定所述更新文件的文件结构列表中存在至少一个与所述待匹配块匹配的文件结构表,具体包括:
确定所述更新文件的文件结构列表中存在至少一个记录的弱校验值与该待匹配块的弱校验值匹配,且,记录的强校验值与该待匹配块的强校验值匹配,且,未标记为已匹配的文件块结构表。
19.如权利要求17所述的方法,其特征在于,将与该待匹配表对应的所述原文件的文件块写入到新建存储区域中,具体包括:
根据与该待匹配表匹配的文件块结构表在所述更新文件的文件结构列表中的位置,将与该待匹配表对应的所述原文件的文件块写入到新建存储区域中的相应位置上;
将所述待匹配块写入到新建存储区域中,具体包括:
根据与所述待匹配块匹配的文件块结构表在所述更新文件的文件结构列表中的位置,将所述待匹配块写入到新建存储区域中的相应位置上;
将该长度小于所述固定长度的文件块写入到新建存储区域中,具体包括:
根据与该长度小于所述固定长度的文件块匹配的文件块结构表在所述更新文件的文件结构列表中的位置,将该长度小于所述固定长度的文件块写入到新建存储区域中的相应位置上;
根据所述新建存储区域中写入的文件块和接收到的服务器发送的文件块更新所述原文件,具体包括:
针对接收到的服务器发送的文件块,根据服务器发送的文件块对应的文件块结构表在所述更新文件的文件结构列表中的位置,将服务器发送的文件块写入到所述新建存储区域中的相应位置上;
将所述新建存储区域中各文件块构成的文件作为更新文件保存,删除所述原文件,并保存获取到的所述更新文件的文件结构列表。
20.一种增量同步的装置,其特征在于,包括:
分割模块,用于在检测到自身存在新增的文件时,将所述文件分割成连续、不重叠的文件块,除最后一个文件块之外,其余文件块的长度为固定长度,并且最后一个文件块的长度不大于所述固定长度;
第一生成模块,用于分别针对分割的每个文件块,确定该文件块的弱校验值和强校验值,并生成该文件块对应的文件块结构表,生成的文件块结构表中记录了该文件块的弱校验值和强校验值;
发送模块,用于将各文件块结构表作为所述文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器进行存储;
第一提取模块,用于在检测到自身保存的所述文件被更新时,将自身保存的更新后的文件作为更新文件,获取服务器中保存的所述更新文件对应的原文件的文件结构列表,提取所述原文件的文件结构列表中的每个文件块结构表;
判断处理模块,用于将所述更新文件的第一个字节确定为起点,确定从所述起点开始的固定长度的文件块为待匹配块,确定所述待匹配块的弱校验值和强校验值;判断提取的每个文件块结构表中是否存在至少一个与所述待匹配块匹配的文件块结构表,其中,与所述待匹配块匹配的文件块结构表为:记录的弱校验值与所述待匹配块的弱校验值匹配,且,记录的强校验值与所述待匹配块的强校验值匹配的文件块结构表;若是,则生成所述待匹配块的文件块结构表,将生成的文件块结构表中的上传标记设置为不上传,并插入到所述更新文件的文件结构列表中的末尾,将所述更新文件中所述待匹配块的下一个字节重新确定为起点;将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,继续判断提取的每个文件块结构表中是否存在至少一个与重新确定的待匹配块匹配的文件块结构表,直至将所述更新文件中所有文件块的文件块结构表插入到所述更新文件的文件结构列表中为止;
所述发送模块还用于,将所述更新文件的文件结构列表发送给所述服务器保存,以更新所述服务器中保存的所述原文件的文件结构列表,并将所述更新文件的文件结构列表中每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储,完成所述更新文件的同步。
21.一种增量同步的系统,其特征在于,包括:
客户端,用于在检测到自身存在新增的文件时,将所述文件分割成连续、不重叠的文件块,除最后一个文件块之外,其余文件块的长度为固定长度,并且最后一个文件块的长度不大于所述固定长度;分别针对分割的每个文件块,确定该文件块的弱校验值和强校验值,并生成该文件块对应的文件块结构表,生成的文件块结构表中记录了该文件块的弱校验值和强校验值;将各文件块结构表作为所述文件的文件结构列表发送给服务器,并将各文件块发送给服务器;在检测到自身保存的所述文件被更新时,将自身保存的更新后的文件作为更新文件,获取服务器中保存的所述更新文件对应的原文件的文件结构列表,提取所述原文件的文件结构列表中的每个文件块结构表;将所述更新文件的第一个字节确定为起点,确定从所述起点开始的固定长度的文件块为待匹配块,确定所述待匹配块的弱校验值和强校验值;判断提取的每个文件块结构表中是否存在至少一个与所述待匹配块匹配的文件块结构表,其中,与所述待匹配块匹配的文件块结构表为:记录的弱校验值与所述待匹配块的弱校验值匹配,且,记录的强校验值与所述待匹配块的强校验值匹配的文件块结构表;若是,则生成所述待匹配块的文件块结构表,将生成的文件块结构表中的上传标记设置为不上传,并插入到所述更新文件的文件结构列表中的末尾,将所述更新文件中所述待匹配块的下一个字节重新确定为起点;将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,继续判断提取的每个文件块结构表中是否存在至少一个与重新确定的待匹配块匹配的文件块结构表,直至将所述更新文件中所有文件块的文件块结构表插入到所述更新文件的文件结构列表中为止;
服务器,用于保存接收到的所述文件结构列表,存储接收到的各文件块。
一种增量同步的方法、装置及系统\n技术领域\n[0001] 本申请涉及通信技术领域,尤其涉及一种增量同步的方法、装置及系统。\n背景技术\n[0002] 目前,在许多应用场景中,都需要对不同设备中的文件进行同步。例如,当设备A中的某个文件进行了版本更新时,就需要同步设备B中相应的文件,使设备B中相应的文件也进行更新。\n[0003] 在现有技术中,一般采用rsync算法进行文件的同步,由于rsync算法能够有效的计算出一个文件比另一个文件更新的部分,因此在文件同步时,只要传输计算出的更新的部分即可完成同步,该过程即为增量同步。\n[0004] 假设设备A中保存了文件a,设备B中保存了文件b,文件a较文件b更新,则需要将设备B中的文件b升级为文件a,此时采用rsync算法进行增量同步的过程如图1所示。图1为现有技术中采用rsync算法进行增量同步的过程,具体包括以下步骤:\n[0005] S101:设备B将保存的文件b分割成连续、不重叠的文件块,除最后一个文件块之外,其余文件块的长度为固定长度S,并且最后一个文件块的长度不大于固定长度S。\n[0006] 分割的各文件块如表1所示:\n[0007]\n 文件块1 文件块2 文件块3\n[0008] 表1\n[0009] 如表1所示,该文件b被分割成了连续且不重叠的3个文件块,即文件块1、文件块2、文件块3。其中,文件块1和文件块2的长度均为S。分割了长度为S的文件块1和文件块2后,文件b剩余的部分的长度已经小于S,因此将剩余的长度小于S的部分作为最后一个文件块,即文件块3,该文件块3的长度小于S。\n[0010] S102:设备B分别计算分割的每个文件块的32位弱校验值和128位信息摘要算法第四版(Message Digest Algorithm 4,MD4)强校验值。\n[0011] S103:设备B将分别计算的每个文件块的弱校验值和强校验值发送给设备A。\n[0012] S104:设备A确定滚动计算的起点,并计算以该起点开始的长度为S的文件块的弱校验值。\n[0013] 假设设备A中的文件a如表2所示。\n[0014]\n 文件块1 文件块4 文件块2 文件块3\n[0015] 表2\n[0016] 如表2所示,文件a由文件块1、文件块4、文件块2、文件块3组成,相比与如表1所示的文件b,文件a是在长度均为S的文件块1和文件块2之间插入了长度小于S的文件块4。\n[0017] 设备A首先确定文件a的第1个字节为滚动计算的起点,也即文件块1的第1个字节为起点。计算的以该起点开始的长度为S的文件块的弱校验值,即为第1个字节到第S个字节的文件块的弱校验值,亦即文件a中文件块1的弱校验值。\n[0018] S105:设备A判断计算的弱校验值是否与设备B发送的每个文件块的弱校验值中的至少一个匹配,若判断结果为是,则进行步骤S106,否则进行步骤S108。\n[0019] 继续沿用上例,由于计算的以确定的起点开始的长度为S的文件块的弱校验值就是文件块1的弱校验值,因此计算的弱校验值与设备B发送的文件块1的弱校验值相匹配。\n[0020] S106:设备A确定以该起点开始的长度为S的文件块的强校验值,针对设备B发送的弱校验值与以该起点开始的长度为S的文件块的弱校验值匹配的文件块,判断确定的强校验值是否与设备B发送的该文件块的强校验值匹配,若判断结果为是,则进行步骤S107,否则进行步骤S108。\n[0021] 继续沿用上例,由于计算的从第1个字节到第S个字节的长度为S的文件块的弱校验值,也即文件a中的文件块1的弱校验值与设备B发送的文件块1的弱校验值相匹配,因此进一步确定文件a中的该文件块1的强校验值,判断确定的该强校验值是否与设备B发送的文件块1的强校验值匹配。由于文件a中的文件块1与文件b中的文件块1相同,因此设备A确定的文件a中的文件块1的强校验值与文件b中的文件块1的强校验值也匹配。\n[0022] S107:确定以该起点开始的长度为S的文件块已经存在于设备B的文件b中,无需传输该长度为S的文件块,将该长度为S的文件块的下一个字节重新确定为滚动计算的起点,并返回步骤S104。\n[0023] 由于设备A确定的文件a中文件块1的弱校验值,与设备B发送的文件b中文件块1的弱校验值匹配,强校验值也匹配,因此确定文件a中的文件块1已经存在与设备B的文件b中,无需再上传该文件块1。并且,将文件a中文件块1的下一个字节,也即第S+1个字节,亦即文件a中的文件块4的第1个字节重新确定为滚动计算的起点,返回步骤S104进行后续校验。\n[0024] S108:设备A将该起点的下一个字节重新确定为滚动计算的起点,并返回步骤S104。\n[0025] 如果步骤S104中设备A计算的弱校验值未与设备B发送的任何一个文件块的弱校验值匹配,则将该起点的下一个字节重新确定为滚动计算的起点,也即将第2个字节重新确定为滚动计算的起点,计算以重新确定的该起点(第2个字节)开始的长度为S的文件块的弱校验值,也即返回步骤S104。\n[0026] 此时计算的弱校验值即为第2个字节到第S+1个字节的文件块的弱校验值,也即由表2所示的文件块1的后S-1个字节和文件块4的第1个字节组成的文件块的弱校验值。\n[0027] S109:当达到文件a的最后一个字节时,设备A将文件a中除了确定的无需传输的文件块之外的其他文件块传输给设备B。\n[0028] 由于按照上述方法进行弱校验值和强校验值匹配时,如表2所示的文件a中文件块\n4的部分需要传输,因此设备A向设备B传输文件块4。\n[0029] 但是,如图1所示的增量同步方法并不适用于分布式存储场景中,这是因为在图1所示的过程中,存储较旧文件的设备B需要计算分割的各文件块的弱校验值和强校验值,存储较新文件的设备A也需要支持rsync算法,以滚动计算各长度为S的文件块的弱校验值和强校验值,而在分布式存储场景中,如果较多的客户端都要与服务器进行文件的增量同步,必然会使服务器耗费大量的资源进行弱校验值和强校验值的计算,导致服务器的压力过大。\n发明内容\n[0030] 本申请实施例提供一种增量同步的方法、装置及系统,用以解决在分布式存储场景中采用现有技术中基于rsync算法的增量同步方法时,服务器压力过大的问题。\n[0031] 本申请实施例提供的一种增量同步的方法,包括:\n[0032] 客户端在检测到自身存在新增的文件时,将所述文件分割成连续、不重叠的文件块,除最后一个文件块之外,其余文件块的长度为固定长度,并且最后一个文件块的长度不大于所述固定长度;\n[0033] 所述客户端分别针对分割的每个文件块,确定该文件块的弱校验值和强校验值,并生成该文件块对应的文件块结构表,生成的文件块结构表中记录了该文件块的弱校验值和强校验值;\n[0034] 所述客户端将各文件块结构表作为所述文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器进行存储。\n[0035] 本申请实施例提供的一种增量同步的装置,包括:\n[0036] 分割模块,用于在检测到自身存在新增的文件时,将所述文件分割成连续、不重叠的文件块,除最后一个文件块之外,其余文件块的长度为固定长度,并且最后一个文件块的长度不大于所述固定长度;\n[0037] 第一生成模块,用于分别针对分割的每个文件块,确定该文件块的弱校验值和强校验值,并生成该文件块对应的文件块结构表,生成的文件块结构表中记录了该文件块的弱校验值和强校验值;\n[0038] 发送模块,用于将各文件块结构表作为所述文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器进行存储。\n[0039] 本申请实施例提供的一种增量同步的系统,包括:\n[0040] 客户端,用于在检测到自身存在新增的文件时,将所述文件分割成连续、不重叠的文件块,除最后一个文件块之外,其余文件块的长度为固定长度,并且最后一个文件块的长度不大于所述固定长度;分别针对分割的每个文件块,确定该文件块的弱校验值和强校验值,并生成该文件块对应的文件块结构表,生成的文件块结构表中记录了该文件块的弱校验值和强校验值;将各文件块结构表作为所述文件的文件结构列表发送给服务器,并将各文件块发送给服务器;\n[0041] 服务器,用于保存接收到的所述文件结构列表,存储接收到的各文件块。\n[0042] 本申请实施例提供一种增量同步的方法、装置及系统,该方法客户端在检测到自身存在新增的文件时,将该文件分割成若干个文件块,并确定各文件块的弱校验值和强校验值,将确定的弱校验值和强校验值记录在相应的文件块对应的文件块结构表中,将各文件块的文件块结构表作为该文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器存储,以完成该新增文件的同步。通过上述方法,在后续的增量同步过程中,如果服务器中保存的该文件是旧文件,则服务器无需计算各文件块的弱校验值和强校验值,直接从各文件块结构表中提取相应各文件块的弱校验值和强校验值即可,因此减轻了服务器的负担。\n附图说明\n[0043] 图1为现有技术中采用rsync算法进行增量同步的过程;\n[0044] 图2为本申请实施例提供的第一种增量同步的过程;\n[0045] 图3为本申请实施例提供的客户端将新增的文件分割成各文件块的示意图;\n[0046] 图4为本申请实施例提供的分布式存储场景下的服务器存储不同文件中的各文件块的示意图;\n[0047] 图5为本申请实施例提供的第一种增量同步的详细过程;\n[0048] 图6为本申请实施例提供的客户端确定各文件块的强校验值以及该新增文件的文件校验值的过程;\n[0049] 图7为本申请实施例提供的第二种增量同步的过程;\n[0050] 图8为本申请实施例提供的第一种更新文件和原文件的对比示意图;\n[0051] 图9为本申请实施例提供的第二种更新文件和原文件的对比示意图;\n[0052] 图10为本申请实施例提供的第三种更新文件和原文件的对比示意图;\n[0053] 图11为本申请实施例提供的第四种更新文件和原文件的对比示意图;\n[0054] 图12为本申请实施例提供的第五种更新文件和原文件的对比示意图;\n[0055] 图13为本申请实施例提供的第三种增量同步的过程;\n[0056] 图14为本申请实施例提供的第六种更新文件和原文件的对比示意图;\n[0057] 图15为本申请实施例提供的第七种更新文件和原文件的对比示意图;\n[0058] 图16为本申请实施例提供的第八种更新文件和原文件的对比示意图;\n[0059] 图17为本申请实施例提供的第九种更新文件和原文件的对比示意图;\n[0060] 图18为本申请实施例提供的第十种更新文件和原文件的对比示意图;\n[0061] 图19为本申请实施例提供的在图13所示的步骤S1304之前客户端进行的判断处理过程;\n[0062] 图20为本申请实施例提供的第十一种更新文件和原文件的对比示意图;\n[0063] 图21为本申请实施例提供的增量同步的装置结构示意图;\n[0064] 图22为本申请实施例提供的增量同步的系统结构示意图。\n具体实施方式\n[0065] 由于在分布式存储场景中,一个服务器与若干个客户端相连,因此在采用基于rsync算法的增量同步方法同步服务器和客户端中的文件时,服务器需要消耗大量的资源来计算文件块的弱校验值和强校验值,导致服务器的压力过大。本申请实施例中为了减轻在分布式存储场景中进行增量同步时服务器的压力,无论客户端中保存的文件较新,还是服务器中保存的文件较新,计算文件块的弱校验值和强校验值的步骤均由客户端来执行,服务器无需进行任何弱校验值和强校验值的计算,从而达到降低服务器压力的目的。\n[0066] 根据具体应用场景的不同,本申请实施例提供的增量同步方法可以分为以下三种:\n[0067] 一、当客户端中存在新增的文件时,应用于将客户端中该新增的文件同步到服务器中的增量同步方法;\n[0068] 二、当客户端中的文件被更新时,应用于将客户端中的更新文件同步到服务器中的增量同步方法;\n[0069] 三、当服务器中的文件被更新时,应用于将服务器中的更新文件同步到客户端中的增量同步方法。\n[0070] 下面结合说明书附图,对本申请实施例中上述三种增量同步方法进行详细描述。\n[0071] 图2为本申请实施例提供的第一种增量同步的过程,具体包括以下步骤:\n[0072] S201:客户端在检测到自身存在新增的文件时,将该文件分割成连续、不重叠的各文件块,除最后一个文件块之外,其余文件块的长度为固定长度,并且最后一个文件块的长度不大于所述固定长度。\n[0073] 在本申请实施例中,客户端保存的每个文件都对应一个唯一的文件标识,具体可以为文件身份标识号码(Identity,ID)。相应的,当客户端检测到自身新增了一个文件标识时,该新增的文件标识对应的文件就是新增的文件。\n[0074] 为了减轻服务器的压力,本申请实施例中由客户端将新增的文件分割为连续、不重叠的各文件块,最后一个文件块之外,其余文件块的长度均为固定长度,并且最后一个文件块的长度不大于所述固定长度,该固定长度可以根据需要进行设定。\n[0075] 具体的,由于在分布式存储场景中,服务器存储一个文件并不是连续存储的,而是将这个文件进行分块存储的,因此客户端将该新增的文件分割为若干个文件块时所基于的固定长度,可以根据分布式存储场景下的服务器进行分块存储的分块长度进行设定。\n[0076] 假设该固定长度为S个字节,则客户端将新增的文件分割成的各文件块如图3所示。图3为本申请实施例提供的客户端将新增的文件分割成各文件块的示意图,在图3中,新增的文件被分割成了连续、不重叠的3个文件块,分别为文件块1、文件块2、文件块3,文件块\n1和文件块2的长度均为该固定长度S,由于该文件中除了文件块1和文件块2以外剩余的文件的长度已不足S个字节,因此最后一个文件块,即文件块3的长度可以不大于该固定长度S。\n[0077] S202:客户端分别针对分割的每个文件块,确定该文件块的弱校验值和强校验值,并生成该文件块对应的文件块结构表,生成的文件块结构表中记录了该文件块的弱校验值和强校验值。\n[0078] 本申请实施例中为了减轻服务器的压力,客户端将该文件分割成若干个文件块后,仍由客户端确定各文件块的弱校验值和强校验值,将确定的弱校验值和强校验值相应记录在各文件块对应的文件块结构表中。\n[0079] 继续以图3为例,客户端将该文件分割为3个文件块之后,分别确定文件块1、文件块2、文件块3的弱校验值和强校验值,并分别生成这3个文件块对应的文件块结构表,将确定的弱校验值和强校验值相应记录对应的文件块结构表中。\n[0080] 其中 ,客 户端 确定文 件块的 弱校验值的方法可以为 ,采 用公式确定文件块的弱校验值的低16位,其中,k表示该新增的文件的第k个\n字节为该文件块的起点(即该文件块的第1个字节),l表示该新增的文件的第l个字节为该文件块的最后一个字节,也即l-k+1就是固定长度S,Xi为该新增的文件中的第i个字节,a(k,l)为确定的该文件块的弱校验值的低16位;采用公式 确\n定该文件块的弱校验值的高16位,其中,b(k,l)为确定的该文件块的弱校验值的高16位;根\n16\n据确定的该文件块的弱校验值的低16位和高16位,采用公式s(k,l)=a(k,l)+2 b(k,l)确定该文件块的弱校验值,其中,s(k,l)为确定的该文件块的弱校验值。\n[0081] 客户端确定文件块的强校验值的方法具体为,根据该文件块的内容确定信息摘要算法第五版(Message Digest Algorithm 5,MD5)值作为该文件块的强校验值。\n[0082] S203:将各文件块结构表作为该文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器进行存储。\n[0083] 在本申请实施例中,一个文件的文件结构列表用于描述该文件的结构,文件结构列表包括该文件的各文件块对应文件块结构表,也即,文件结构列表用于描述该文件具体由哪些文件块构成。而文件块结构表描述的则是一个文件块的具体信息,包括该文件块的弱校验值和强校验值。\n[0084] 继续以图3为例,客户端将文件块1、文件块2、文件块3这3个文件块对应的文件块结构表作为新增的文件的文件结构列表发送给服务器保存,并将这3个文件块发送给服务器进行存储。从而在后续的增量同步过程中,如果服务器中保存的该文件是旧文件,则由于服务器保存该文件时,是通过保存文件块1、文件块2、文件块3的方式来保存该文件的,因此服务器无需再将该文件分割为各文件块,并且由于服务器保存的该文件的文件结构列表中包括了这3个文件块对应的文件块结构表,而文件块结构表中又记录了相应文件块的弱校验值和强校验值,因此服务器也无需再确定各文件块的弱校验值和强校验值,直接从相应的文件块结构表中提取弱校验值和强校验值即可。\n[0085] 在上述过程中,客户端在检测到自身存在新增的文件时,将该文件分割成若干个文件块,并确定各文件块的弱校验值和强校验值,将确定的弱校验值和强校验值记录在相应的文件块对应的文件块结构表中,将各文件块的文件块结构表作为该文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器存储,以完成该新增文件的同步。在后续的增量同步过程中,如果服务器中保存的该文件是旧文件,则服务器无需将该文件分割为若干个文件块,也无需计算各文件块的弱校验值和强校验值,直接从该文件的文件结构列表中的各文件块结构表中提取相应各文件块的弱校验值和强校验值即可,因此减轻了服务器的负担。\n[0086] 服务器接收到客户端发送的各文件块后,为每个文件块分配一个存储地址,并将接收到的各文件块存储到分配的相应存储地址对应的存储空间上。而分布式存储场景下的服务器在为各文件块分配存储地址时,分配的各存储地址并不是连续的,也即服务器并不是在连续的若干个存储空间中存储接收到的这些文件块的,或者说服务器并不是连续存储该新增的文件的。\n[0087] 因此,本申请实施例中客户端在将各文件块结构表作为该新增的文件的文件结构列表发送给服务器保存之前,还需要通过各文件块的文件块结构表,告知服务器该新增的文件中的各个文件块的排序顺序。\n[0088] 具体的,在图2所示的步骤S203之前,也即客户端在将各文件块结构表作为该新增的文件的文件结构列表发送给服务器保存之前,还要为每个文件块分配文件块标识,针对每个文件块,根据分割的各文件块在该新增的文件中的排序顺序,确定与该文件块相邻且排在该文件块之前的前继文件块的文件块标识,确定与该文件块相邻且排在该文件块之后的后继文件块的文件块标识,将该文件块的文件块标识、确定的前继文件块的文件块标识、后即文件块的文件块标识记录在该文件块对应的文件块结构表中。其中,为文件块分配的文件块标识可以为文件块ID。\n[0089] 并且,由于该文件中不存在排在第一个文件块之前的文件块,也不存在排在最后一个文件块之后的文件块,因此,该文件中第一个文件块的前继文件块的文件块标识以及最后一个文件块的后继文件块的文件块标识均可以设置为默认值,例如为-1。\n[0090] 继续以图3为例,客户端为该新增的文件中的文件块1分配ID1,为文件块2分配ID2,为文件块3分配ID3,这3个文件块在该新增的文件中的排序顺序为文件块1、文件块2、文件块3。针对文件块1,由于该新增的文件中不存在排在文件块1之前的文件块,因此,文件块1的前继文件块的文件块标识为-1,并且,由于与文件块1相邻且排在文件块1之后的文件块为文件块2,因此,文件块1的后继文件块的文件块标识为文件块2的文件块标识,也即ID2。相应的,针对文件块2,文件块2的前继文件块的文件块标识为ID1,后继文件块的文件块标识为ID3;针对文件块3,文件块3的前继文件块的文件块标识为ID2,后继文件块的文件块标识为-1。客户端将这3个文件块的文件块标识,以及前继文件块的文件块标识、后继文件块的文件块标识记录在相应的文件块结构表中。此时,这3个文件块的文件块结构表中除了记录有相应文件块的弱校验值和强校验值之外,还记录有相应文件块的文件块标识、前继文件块的文件块标识、后继文件块的文件块标识。\n[0091] 当然,生成的文件块结构表中还可以记录相应文件块的起始位置和长度。\n[0092] 将各文件块的文件块标识、前继文件块的文件块标识、后继文件块的文件块标识记录在相应的文件块结构表中后,将各文件块结构表作为该新增的文件的文件结构列表发送给服务器,服务器则可以根据各文件块结构表中相应记录的前继文件块的文件块标识和后继文件块的文件块标识,确定该新增的文件中各文件块的排序顺序,从而可以连续的读出各文件块。\n[0093] 进一步的,由于本申请实施例中文件结构列表是用于描述相应文件的结构的,因此,图2所示的步骤S203中客户端将各文件块结构表作为该新增的文件的文件结构列表发送给服务器保存的方法具体为:按照每个文件块在该新增的文件中的排序顺序,将每个文件块对应的文件块结构表进行排序,将排序后的各文件块结构表作为该新增的文件的文件结构列表发送给服务器保存。这样,服务器根据文件结构列表中各文件块结构表的排序顺序,可以更加准确的确定该新增的文件中各文件块的排序顺序。\n[0094] 在本申请实施例中,为了使服务器获知客户端将要发送的各文件块的信息,客户端在将排序后的各文件块结构表作为该新增的文件的文件结构列表发送给服务器保存之前,还可将每个文件块结构表中的文件块上传标记设置为上传。服务器接收到该新增的文件的文件结构列表后,则可以根据该文件结构列表中每个上传标记为上传的文件块结构表,确定客户端将要上传的各文件块的信息。相应的,客户端将各文件块发送给服务器进行存储的方法具体为:将每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储。\n[0095] 另外,在分布式存储场景中,服务器在存储一个文件时,是将这个文件中的各文件块分别进行存储的,服务器在存储文件块时,也要为该文件块分配一个文件块ID,该文件块ID对应着该文件块的存储地址,因此,通过该文件块ID,就可以到对应的存储地址中读取该文件块。而对于两个以上不同的文件,这两个以上不同的文件中也可能包括相同的文件块,但服务器对于不同文件中的相同文件块也并非是将该相同文件块保存多次,而是只保存一次,但是分别针对这两个以上不同的文件,赋予该相同文件块不同的文件块ID,如图4所示。\n[0096] 图4为本申请实施例提供的分布式存储场景下的服务器存储不同文件中的各文件块的示意图,在图4中,服务器存储文件A和文件B,文件A包括:文件块1、文件块2,文件B包括文件块2、文件块3。服务器针对文件A,为文件块1分配IDa1,为文件块2分配IDa2,其中,IDa1与文件块1的存储地址对应,IDa2与文件块2的存储地址对应。服务器针对文件B,为文件块2分配IDb2,为文件块3分配IDb3,其中,IDb2也与文件块2的存储地址对应,IDb3与文件块3的存储地址对应。可以看出,文件块2具有两个文件块ID,分别为IDa2和IDb2,也即,在分布式存储场景下,服务器中保存的文件块具有至少一个文件块ID,而一个文件块ID只对应一个文件块。\n[0097] 进一步的,在图2所示的过程中,客户端要向服务器上传的该新增的文件中的各文件块中,就可能存在服务器已经保存的文件块。因此,为了避免向服务器重复上传相同的文件块而导致浪费网络资源,本申请实施例中客户端在将每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储之前,先接收服务器返回的调整后的文件结构列表,其中,服务器调整文件结构列表具体为:针对接收到的该文件结构列表中的每个文件块结构表,根据该文件块结构表中记录的强校验值,判断服务器自身是否已经保存了相同强校验值的文件块,当判断结果为是时,将该文件块结构表中包含的文件块上传标记调整为不上传。\n[0098] 也即,服务器接收到客户端发送的每个上传标记均为上传的文件块结构表后,据此获知客户端将要上传的各文件块的信息,如果服务器保存的文件块中,存在强校验值与某个文件块结构表中记录的强校验值相同的文件块,则说明服务器中已经保存了该文件块结构表对应的文件块,因此将该文件块结构表的上传标记调整为不上传,以通知客户端无需上传该文件块。\n[0099] 相应的,客户端将每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储的方法具体为:根据服务器返回的调整后的文件结构列表中每个文件块结构表的文件块上传标记,将上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储。\n[0100] 继续以图3为例进行说明,客户端将文件块1、文件块2、文件块3对应的文件块结构表的上传标记均设置为上传后,作为该新增的文件的文件结构列表发送给服务器。假设服务器已经保存了文件块2,则服务器将文件块2的文件块结构表的上传标记调整为不上传,并将调整后的文件结构列表返回客户端。客户端根据服务器返回的调整后的文件结构列表,确定文件块2的文件块结构表的上传标记已被调整为不上传,因此只发送文件块1和文件块3,不发送文件块2。\n[0101] 更进一步的,在本申请实施例中,当客户端检测到自身存在新增的文件,并通过上述方法将该新增的文件同步到服务器中时,可能此时服务器也已经保存了该新增的文件,而如果服务器已经保存了该新增的文件,客户端则无需向服务器发送该新增的文件中的任何一个文件块。\n[0102] 因此,客户端在将每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储之前,还要确定该新增文件的文件校验值并发送给服务器,并接收服务器返回的调整后的文件结构列表,其中,服务器调整文件结构列表具体为:根据该新增文件的文件校验值,判断服务器自身是否已经保存了相同文件校验值的文件,若是,则提取保存的具有该文件校验值的文件的文件结构列表,将提取的文件结构列表中的每个文件块结构表中包含的文件块上传标记调整为不上传,作为调整后的文件结构列表,否则,针对客户端发送的文件结构列表中的每个文件块结构表,根据该文件块结构表中包含的强校验值,判断服务器自身是否已经保存了相同强校验值的文件块,当判断结果为是时,将该文件块结构表中包含的文件块上传标记调整为不上传。\n[0103] 也即,客户端将该新增文件的文件校验值和文件结构列表发送给服务器。如果服务器自身保存的文件中,存在文件校验值与该新增文件的文件校验值相同的文件,则直接提取保存的具有该文件校验值的文件结构列表,并将提取的文件结构列表中的各文件块结构表的上传标记均设置为不上传,作为调整后的文件结构列表返回客户端,使客户端根据调整后的文件结构列表,不上传该新增文件中的任何文件块,并保存该调整后的文件结构列表作为该新增文件对应的文件结构列表,使客户端中该新增文件对应的文件结构列表与服务器中相应文件对应的文件结构列表一致。如果服务器自身保存的文件中,不存在文件校验值与该新增文件的文件校验值相同的文件,则进一步根据该文件结构列表中每个文件块结构表记录的相应文件块的强校验值,判断自身是否保存了相同的文件块,并根据判断结果调整文件块结构表的上传标记。\n[0104] 图5为本申请实施例提供的第一种增量同步的详细过程,具体包括以下步骤:\n[0105] S501:客户端在检测到自身存在新增的文件时,将该文件分割成连续、不重叠的各文件块。\n[0106] 其中,除最后一个文件块之外,其余文件块的长度均为固定长度,最后一个文件块的长度不大于该固定长度。\n[0107] S502:为每个文件块分配文件块ID。\n[0108] S503:针对分割的每个文件块,根据各文件块在该文件中的排序顺序,确定该文件块的前继文件块的文件块ID、后继文件块ID,确定该文件块的弱校验值和强校验值,生成该文件块的文件块结构表。\n[0109] 该文件块的文件块结构表中记录了该文件块的文件块ID、前继文件块的文件块ID、后继文件块的文件块ID、弱校验值和强校验值。\n[0110] S504:确定该文件的文件校验值并发送给服务器。\n[0111] S505:将每个文件块结构表的上传标记设置为上传,并按照每个文件块在该文件中的排序顺序,将每个文件块对应的文件块结构表进行排序,将排序后的各文件块结构表作为该文件的文件结构列表发送给服务器保存。\n[0112] S506:服务器判断自身是否保存了相同文件校验值的文件,若是,则进行步骤S507,否则进行步骤S509。\n[0113] S507:服务器提取保存的具有该文件校验值的文件的文件结构列表,将提取的文件结构列表中的每个文件块结构表的上传标记调整为不上传,并返回客户端。\n[0114] S508:客户端根据接收到的调整后的文件结构列表中每个文件块结构表的上传标记,不发送该文件中的任何文件块,并根据调整后的文件结构列表调整该文件的结构。\n[0115] S509:服务器根据该文件结构列表中每个文件块结构表记录的强校验值,以及自身保存的各文件块的强校验值,调整该文件结构列表,将调整后的文件结构列表返回客户端。\n[0116] 其中,针对客户端发送的文件结构列表中的每个文件块结构表,根据该文件块结构表中包含的强校验值,若服务器自身已经保存了相同强校验值的文件块,则将该文件块结构表中的上传标记调整为不上传,否则不调整该文件块结构表中的上传标记。\n[0117] 当然,服务器还可以根据自身的实际情况调整每个文件块结构表中记录的相应文件块的文件块ID,并根据调整后的文件块ID,相应调整各文件块结构表中记录的前继文件块的文件块ID和后继文件块的文件块ID。\n[0118] S510:客户端根据调整后的文件结构列表中每个文件块结构表的上传标记,将上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储。\n[0119] 当然,客户端也要保存该调整后的文件结构列表,使客户端中保存的该新增文件的文件结构列表与服务器中保存的该新增文件的文件结构列表一致。\n[0120] 并且,当图5所示的增量同步过程完成后,客户端和服务器还要将各自保存的该新增文件的文件结构列表中每个文件块结构表的上传标记删除。也即,本申请实施例中文件块结构表中的上传标记是客户端用于告知服务器将要发送的各文件块的信息的,以及服务器用于告知客户端实际需要发送的文件块的信息的。因此,只有当客户端和服务器进行增量同步时才会设置,其他情况下则不需要设置该上传标记。\n[0121] 或者,客户端在生成一个文件块对应的文件块结构表时,也可以生成两份文件块结构表,一份文件块结构表不带有上传标记,用于自身保存,描述该文件块的结构,另一份文件块结构表带有上传标记,用于向服务器发送,告知将要向服务器上传的文件块的信息。\n相应的,服务器接收到客户端发送的文件结构列表,并对接收到的文件结构列表中的文件块结构表进行调整后,也可以再生成对应的不带有上传标记的文件块结构表用于自身保存,调整后的带有上传标记的文件块结构表用于返回客户端。在图5所示的增量同步过程完成后,客户端和服务器则删除用于与对方交互的文件块结构表,只保存不带有上传标记的文件块结构表即可。\n[0122] 在图5所示的过程中,步骤S503中客户端确定的文件块的强校验值可以是该文件块的MD5值,步骤S504中客户端确定的该新增文件的文件校验值也可以是该文件的MD5值。\n然而,当客户端确定该新增文件中各文件块的强校验值时,就需要根据各文件块的内容确定相应文件块的MD5值,在确定该新增文件的校验值时,又需要根据该新增文件的内容确定该文件的MD5值,这样需要两次读取该新增文件的内容。\n[0123] 本申请实施例中为了降低读取该新增文件的内容的次数,以提高增量同步的效率,采用如图6所示的过程确定该新增文件中各文件块的强校验值以及该新增文件的文件校验值。图6为本申请实施例提供的客户端确定各文件块的强校验值以及该新增文件的文件校验值的过程,具体包括以下步骤:\n[0124] S601:将该新增文件分割为各文件块后,确定各文件块在该新增文件中的排序顺序。\n[0125] S602:根据第一个文件块的内容,确定第一个文件块的MD5值作为第一个文件块的强校验值,并作为文件校验值。\n[0126] S603:判断是否还有下一个文件块,若是,则执行步骤S604,否则执行步骤S606。\n[0127] S604:根据下一个文件块的内容,确定该下一个文件块的MD5值作为该下一个文件块的强校验值。\n[0128] S605:根据文件校验值与该下一个文件块的内容,重新确定MD5值作为文件校验值,返回步骤S603。\n[0129] S606:将最终确定的文件校验值作为该新增文件的文件校验值。\n[0130] 继续以图3进行说明,新增文件包括文件块1、文件块2、文件块3,这3个文件块在新增文件中的排序顺序为文件块1、文件块2、文件块3。\n[0131] 先根据文件块1的内容,确定文件块1的MD5值,将确定的该文件块1的MD5值作为该文件块1的强校验值,同时也作为文件校验值。\n[0132] 再根据文件块2的内容,确定文件块2的MD5值,作为该文件块2的强校验值,并根据当前的文件校验值(文件块1的MD5值)以及文件块2的内容,重新确定MD5值作为文件校验值。由于重新确定的文件校验值是根据文件块1的MD5值和文件块2的内容确定的,而文件块\n1的MD5值又是根据文件块1的内容确定的,因此此时重新确定的文件校验值即可看做是根据文件块1和文件块2的内容确定的文件校验值。\n[0133] 最后根据文件块3的内容,确定文件块3的MD5值,作为该文件块3的强校验值,并根据当前的文件校验值(根据文件块1的MD5值和文件块2的内容确定的MD5值)和文件块3的内容,重新确定MD5值作为文件校验值。最后确定的文件校验值即为该新增文件的文件校验值。\n[0134] 以上是当客户端中存在新增的文件时,应用于将客户端中该新增的文件同步到服务器中的第一种增量同步方法。下面对当客户端中的文件被更新时,应用于将客户端中的更新文件同步到服务器中的第二种增量同步方法进行详细描述。\n[0135] 本申请实施例中的第二种增量同步方法旨在使客户端将更新文件增量同步到服务器中时,也不需要服务器进行任何文件块的弱校验值和强校验值的计算。因此,第二种增量同步方法需要基于上述第一种增量同步方法,当客户端和服务器保存了相同的文件时,如果客户端中的文件被更新,则需要服务器提供针对原文件保存的文件结构列表中各文件块结构表记录的弱校验值和强校验值,以便客户端确定需要向服务器发送的更新文件中的文件块。\n[0136] 具体的,当客户端采用上述第一种增量同步的方法将新增的文件同步到服务器中时,客户端和服务器中均保存了相同的该新增的文件的文件结构列表。当客户端检测到自身保存的该文件被更新时,将更新后的文件增量同步到服务器的过程如图7所示。\n[0137] 图7为本申请实施例提供的第二种增量同步的过程,具体包括以下步骤:\n[0138] S701:客户端在检测到自身保存的该文件被更新时,将自身保存的更新后的文件作为更新文件,获取服务器中保存的该更新文件对应的原文件的文件结构列表,提取原文件的文件结构列表中的每个文件块结构表。\n[0139] 在本申请实施例中,由于客户端采用了第一种增量同步的方法将新增的文件同步到服务器中,因此,当客户端中保存的该文件被更新时,服务器中仍然保存着对应的原文件(上述采用第一种增量同步方法同步到服务器中的新增的文件)的文件结构列表,因此,客户端可以向服务器获取原文件的文件结构列表。\n[0140] 另外,当客户端中保存的文件被更新时,客户端中保存的文件是更新文件,但是客户端中保存的文件结构列表却尚未更新,也即客户端中保存的仍然是原文件的文件结构列表,与服务器中保存的原文件的文件结构列表相同,因此,为了节省网络资源,客户端可以直接将自身保存的更新文件对应的原文件的文件结构列表,作为获取的服务器中保存的原文件的文件结构列表。\n[0141] S702:将更新文件的第一个字节确定为起点,确定从该起点开始的固定长度的文件块为待匹配块,确定待匹配块的弱校验值和强校验值。\n[0142] 假设原文件中的各文件块为文件块1、文件块2、文件块3,文件块1和文件块2的长度为固定长度S,文件块3的长度不大于该固定长度S,而更新文件则是在文件块1和文件块2之间插入了一个长度也是固定长度S的文件块4,如图8所示。\n[0143] 图8为本申请实施例提供的第一种更新文件和原文件的对比示意图,在图8中,更新文件相当于是在原文件的文件块1和文件块2之间又插入了一个长度为固定长度S的文件块4,则客户端将该更新文件的第一个字节确定为起点,确定从该起点开始的固定长度的文件块为待匹配块,也即,将更新文件的第一个字节到第S个字节的文件块作为待匹配块,确定的待匹配块即为更新文件中的文件块1,并确定该文件块1的弱校验值和强校验值。\n[0144] S703:判断提取的每个文件块结构表中是否存在至少一个与该待匹配块匹配的文件块结构表,若是,则执行步骤S704,否则,执行步骤S705。\n[0145] 在本申请实施例中,与该待匹配块匹配的文件块结构表为:记录的弱校验值与该待匹配块的弱校验值匹配,且,记录的强校验值与该待匹配块的强校验值也匹配的文件块结构表。也即,判断提取的文件块结构表中是否存在至少一个与该待匹配块匹配的文件块结构表的方法为,在提取的各文件块结构表中,判断是否存在至少一个记录的弱校验值与该待匹配块的弱校验值匹配,且,记录的强校验值与该待匹配块的强校验值也匹配的文件块结构表。\n[0146] 继续以图8为例,在确定了待匹配块的弱校验值和强校验值后,也即在确定了更新文件中文件块1的弱校验值和强校验值后,根据步骤S701提取的每个文件块结构表,判断是否存在至少一个与更新文件中的文件块1匹配的文件块结构表。显然,由于原文件中的文件块1与更新文件中的文件块1是相同的文件块,而提取的各文件块结构表是从原文件的文件结构列表中提取的,因此,原文件中文件块1对应的文件块结构表与更新文件中的文件块1匹配,也即原文件中文件块1对应的文件块结构表与待匹配块匹配。\n[0147] S704:生成该待匹配块的文件块结构表,将生成的文件块结构表中的上传标记设置为不上传,并插入到该更新文件的文件结构列表中的末尾,将该更新文件中该待匹配块的下一个字节重新确定为起点,并进行步骤S709。\n[0148] 当存在与该待匹配块匹配的文件块结构表时,说明服务器中已经保存有该待匹配块,也即已经保存了从当前起点开始的固定长度的文件块,不需要上传该待匹配块,因此将生成的该待匹配块的文件块结构表中的上传标记设置为不上传。\n[0149] S705:确定当前该更新文件的文件结构列表中排在末尾的文件块结构表对应的文件块的最后一个字节。\n[0150] S706:判断从确定的最后一个字节的下一个字节到该起点的长度是否达到固定长度,若判断结果为是,则进行步骤S707,否则进行步骤S708。\n[0151] 其中,如果在步骤S705中当前该更新文件的文件结构列表中尚未存在任何文件块结构表时,则步骤S706中将该更新文件的第一个字节作为确定的最后一个字节的下一个字节,也即此时判断该更新文件的第一个字节到该起点的长度是否达到固定长度。\n[0152] S707:生成确定的最后一个字节的下一个字节到该起点的文件块的文件块结构表,将生成的文件块结构表中的上传标记设置为上传,并插入到该更新文件的文件结构列表中的末尾,执行步骤S708。\n[0153] 当确定的最后一个字节的下一个字节到该起点的长度已经达到固定长度时,说明从确定的最后一个字节的下一个字节到该起点的文件块未保存在服务器中,需要上传,因此,生成从确定的最后一个字节的下一个字节到该起点的文件块的文件块结构表,并将上传标记设置为上传,插入到更新文件的文件结构列表中的末尾。\n[0154] S708:将该更新文件中该起点的下一个字节重新确定为起点,执行步骤S709。\n[0155] S709:将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,计算重新确定的待匹配块的弱校验值和强校验值,并返回步骤S703,直至将该更新文件中所有文件块的文件块结构表插入到该更新文件的文件结构列表中为止。\n[0156] 当将该更新文件中所有文件块的文件块结构表插入到该更新文件的文件结构列表中时,跳出上述步骤S703~S709的循环,执行下述步骤S710。\n[0157] S710:将该更新文件的文件结构列表发送给服务器保存,以更新服务器中保存的该原文件的文件结构列表,并将该更新文件的文件结构列表中每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储,完成该更新文件的同步。\n[0158] 在上述步骤S703~S709中,由于当客户端中的文件被更新时,客户端中保存的仍然是原文件的文件结构列表,并未生成更新文件的文件结构列表,因此需要重新生成该更新文件的文件结构列表。并且,生成的文件结构列表中要包含该更新文件中各文件块对应的文件块结构表,该更新文件中各文件块的文件块结构表在生成的文件结构列表中的排序顺序也要与各文件块在该更新文件中的排序顺序一致。因此,本申请实施例中从更新文件的第一个字节开始,依次向后对各个待匹配块进行上述步骤S703~S709的循环判断处理过程。\n[0159] 下面以下述几种情况详细说明步骤S703~S709的循环判断处理过程。\n[0160] 情况一、仍以图8为例进行说明。\n[0161] 在步骤S702中,确定的待匹配块是以更新文件的第一个字节为起点的固定长度的文件块,也即更新文件中的文件块1,则在步骤S703中,客户端确定提取的文件块结构表中存在与该待匹配块匹配的文件块结构表,因此执行步骤S704。\n[0162] 在步骤S704中,生成该待匹配块的文件块结构表,也即生成更新文件中文件块1的文件块结构表。其中,生成该待匹配块的文件块结构表时,为该待匹配块分配文件块标识,根据当前更新文件的文件结构列表中排在末尾的文件块结构表,确定排在末尾的文件块结构表对应的文件块的文件块标识,作为待匹配块的前继文件块的文件块标识,将确定所述待匹配块时所基于的起点作为所述待匹配块的起始位置,生成包含该待匹配块的文件块标识、前继文件块的文件块标识、起始位置、长度、弱校验值和强校验值的文件块结构表。\n[0163] 由于此时生成的文件块结构表是更新文件中文件块1的文件块结构表,因此客户端为更新文件中的文件块1分配文件块标识,为更新文件中的文件块1分配的文件块标识可以与原文件中文件块1的文件块标识相同,也可以不同。而由于此时当前更新文件的文件结构列表中不存在任何文件块结构表,因此该更新文件中文件块1的前继文件块的文件块标识可以设置为默认值,例如为-1。更新文件中的文件块1的起始位置为当前起点,也即更新文件的第一个字节,长度即为固定长度S。\n[0164] 客户端将生成的该待匹配块(更新文件中的文件块1)的文件块结构表的上传标记设置为不上传,并插入到该更新文件的文件结构列表中的末尾,也即将生成的该文件块结构表作为更新文件的文件结构列表中的最后一个文件块结构表。而由于该待匹配块是更新文件中的第一个文件块,因此将该待匹配块的文件块结构表插入到该更新文件的文件结构列表中的末尾后,该待匹配块的文件块结构表既是当前更新文件的文件结构列表中的第一个文件块结构表,也是最后一个文件块结构表。\n[0165] 在本申请实施例中,将生成的待匹配块的文件块结构表插入到更新文件的文件结构列表中的末尾之后,还要将当前更新文件的文件结构列表中该待匹配块的文件块结构表的前一个文件块结构表中的后继文件块的文件块标识修改为该待匹配块的文件块标识。\n[0166] 而由于此时生成的文件块结构表是更新文件中文件块1的文件块结构表,当前更新文件的文件结构列表不存在生成的该文件块结构表的前一个文件块结构表,因此无需修改前一个文件块结构表中的后继文件块的文件块标识。\n[0167] 将该待匹配块(更新文件中的文件块1)的文件块结构表插入到该更新文件的文件结构列表中的末尾后,由于尚未将该更新文件中所有文件块的文件块结构表插入到该更新文件的文件结构列表中,因此,将该待匹配块的下一个字节,也即该更新文件中文件块1的最后一个字节的下一个字节重新确定为起点,将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,计算重新确定的待匹配块的弱校验值和强校验值,并继续判断提取的每个文件块结构表中是否存在至少一个与重新确定的待匹配块匹配的文件块结构表,也即返回步骤S703。\n[0168] 情况二、继续以图8为例,延续上述情况一的过程。\n[0169] 重新确定的起点为更新文件中文件块1最后一个字节的下一个字节,而由于更新文件中在文件块1和文件块2之间插入的文件块4的长度恰好为固定长度,因此,从重新确定的起点开始的固定长度的文件块即为文件块4,也即重新确定的文件块即为文件块4。\n[0170] 由于文件块4是在客户端的更新文件中新加入的文件块,因此文件块4并未保存在服务器中,从而在步骤S703中,客户端确定提取的文件结构表中不存在于该待匹配块匹配的文件块结构表,因此执行步骤S705。\n[0171] 在步骤S705中,确定当前该更新文件的文件结构列表中排在末尾的文件块结构表对应的文件块的最后一个字节,确定的即为更新文件中文件块1的最后一个字节。\n[0172] 在步骤S706中,由于该文件块1的最后一个字节的下一个字节即为当前起点(文件块4的第一个字节),因此从确定的最后一个字节的下一个字节到当前起点的长度只有1个字节,未达到固定长度,因此判断结果为否,直接执行步骤S708。在步骤S708中,当前起点的下一个字节为文件块4的第二个字节,因此重新确定的起点即为文件块4的第二个字节。在步骤S709中,重新确定的待匹配块即为以文件块4的第二个字节为起点的固定长度的文件块,也即从文件块4的第二个字节到文件块2的第一个字节的文件块。\n[0173] 计算重新确定的该待匹配块的弱校验值和强校验值后,返回步骤S703。由于重新确定的待匹配块仍然不与在步骤S701中提取的任何文件块结构表匹配,因此重复执行步骤S703、S705、S706、S708,直至重新确定的起点为文件块4的最后一个字节。\n[0174] 当重新确定的起点为文件块4的最后一个字节时,由于当前该更新文件的文件结构列表中排在末尾的文件块结构表对应的文件块的最后一个字节即为文件块1的最后一个字节,而文件块1的最后一个字节的下一个字节(文件块4的第一个字节)到当前起点(文件块4的最后一个字节)的长度已经达到固定长度,因此,在步骤S706中的判断结果为是,执行步骤S707。\n[0175] 在步骤S707中,生成从确定的最后一个字节的下一个字节到当前起点的文件块的文件块结构表,也即生成文件块4的文件块结构表,将生成的文件块结构表的上传标记设置为上传,并插入到更新文件的文件结构列表中的末尾。将文件块4的文件块结构表插入到更新文件的文件结构列表中的末尾后,此时的更新文件的文件结构列表中就包括了文件块1和文件块4的文件块结构表,而且这两个文件块结构表的排序顺序与文件块1和文件块4在更新文件中的排序顺序是一致的。\n[0176] 并且,将文件块4的文件块结构表插入到更新文件的文件结构列表中的末尾后,还要将前一个文件块结构表中的后继文件块的文件块标识修改为该文件块4的文件块标识,也即,将文件块1的文件块结构表中的后继文件块的文件块标识修改为文件块4的文件块标识。\n[0177] 在执行步骤S707后,继续执行步骤S708,将该更新文件中当前起点的下一个字节重新确定为起点,也即将文件块2的第一个字节(文件块4的最后一个字节的下一个字节)重新确定为起点。再执行步骤S709,重新确定的待匹配块即为更新文件中的文件块2,计算重新确定的待匹配块(更新文件中的文件块2)的弱校验值和强校验值,并返回步骤S703继续对更新文件中的文件块2进行判断处理过程。\n[0178] 对文件块2的判断处理过程与情况一基本相同,所不同的是将文件块2的文件块结构表插入到更新文件的文件结构列表中的末尾后,需要修改前一个文件块结构表(文件块4的文件块结构表)中的后继文件块的文件块标识,这里就不再赘述。\n[0179] 需要说明的是,当对文件块2的判断处理过程结束后,由于以文件块2的下一个字节,也即文件块3的第一个字节为起点,到更新文件的最后一个字节的长度已经不足固定长度,因此直接将以文件块2的下一个字节到更新文件的最后一个字节的文件块作为待匹配块进行判断处理即可,也即对文件块3进行判断处理。\n[0180] 情况三、如图9所示。\n[0181] 图9为本申请实施例提供的第二种更新文件和原文件的对比示意图,在图9中,更新文件相当于是在原文件的文件块1和文件块2之间又插入了一个小于该固定长度S的文件块5。当客户端中的更新文件以及服务器中保存的原文件如图9所示时,客户端首先按照与情况一基本相同的方法对更新文件中的文件块1进行判断处理,将文件块1的文件块结构表插入到更新文件中的末尾,并将文件块1的下一个字节(文件块5的第一个字节)重新确定为起点,将更新文件中重新确定的起点开始的固定长度的文件块重新确定为待匹配块,并计算重新确定的待匹配块的弱校验值和强校验值,返回步骤S703。\n[0182] 此时,由于文件块5的长度小于固定长度,因此重新确定的待匹配块为文件块5以及文件块2的前若干个字节构成的文件块,从而执行步骤S703时,判断结果为否,执行步骤S705和S706。而在执行步骤S706时,由于文件块5的长度小于固定长度,因此将文件块5中的任何一个字节确定为起点时,步骤S706的判断结果均为否,从而循环执行步骤S705、S706、S708、S709、S703,直至循环中的步骤S708中将文件块5的下一个字节,也即更新文件中文件块2的第一个字节重新确定为起点。\n[0183] 当步骤S708中将更新文件中文件块2的第一个字节重新确定为起点时,步骤S709重新确定的待匹配块即为文件块2,从而返回步骤S703时,步骤S703的判断结果为是(服务器保存的原文件中已存在文件块2,因此步骤S701提取的文件块结构表中存在与更新文件中的文件块2匹配的文件块结构表),从而按照与情况一相同的方法对文件块2进行了判断处理过程,将文件块2的文件块结构表插入到了更新文件的文件结构列表中的末尾。\n[0184] 此时,更新文件的文件结构列表中所包含的文件块结构表为:文件块1的文件块结构表和文件块2的文件块结构表,显然,更新文件的文件结构列表中漏掉了长度小于该固定长度的文件块5的文件块结构表,这样就会降低增量同步的准确性。\n[0185] 本申请实施例中为了提高增量同步的准确性,使客户端能够对两个固定长度的文件块之间的小于该固定长度的文件块进行判断处理,当在步骤S703中判断存在至少一个与当前确定的待匹配块匹配的文件块结构表时,在将生成的待匹配块的文件块结构表插入到该更新文件的文件结构列表中的末尾之后,将更新文件中该待匹配块的下一个字节重新确定为起点之前,根据当前该更新文件的文件结构列表中该待匹配块的文件块结构表的前一个文件块结构表,确定该前一个文件块结构表对应的文件块,如果该待匹配块与该前一个文件块结构表对应的文件块之间存在一个长度小于固定长度的文件块,则确定该长度小于该固定长度的文件块的弱校验值和强校验值,判断提取的每个文件块结构表中是否存在至少一个与该长度小于固定长度的文件块匹配的文件块结构表,若是,则生成该长度小于固定长度的文件块的文件块结构表,将生成的文件块结构表中的上传标记设置为不上传,并插入到更新文件的文件结构列表中该前一个文件块结构表和该待匹配块的文件块结构表之间,否则生成该长度小于固定长度的文件块的文件块结构表,将生成的文件块结构表中的上传标记设置为上传,并插入到更新文件的文件结构列表中该前一个文件块结构表和待匹配块的文件块结构表之间。\n[0186] 继续以图9为例,客户端将文件块2的文件块结构表(当前待匹配块的文件块结构表)插入到更新文件的文件结构列表中之后,在将文件块2的下一个字节(文件块3的第一个字节)重新确定为起点之前,根据更新文件的文件结构列表中该文件块2的文件块结构表的前一个文件块结构表,确定该前一个文件块结构表对应的文件块,由于当前更新文件的文件结构列表中文件块2的文件块结构表的前一个文件块结构表即为文件块1的文件块结构表,因此确定的前一个文件块结构表对应的文件块即为更新文件中的文件块1。由于更新文件中的文件块1和文件块2之间存在长度小于固定长度的文件块5,因此确定该文件块5的弱校验值和强校验值,判断在步骤S701中提取的每个文件块结构表中是否存在至少一个与文件块5匹配的文件块结构表。由于服务器中保存的原文件中不包括该文件块5,因此判断不存在与文件块5匹配的文件块结构表,从而生成该文件块5的文件块结构表,将生成的文件块5的文件块结构表的上传标记设置为上传,并插入到更新文件的文件结构列表中文件块1的文件块结构表和文件块2的文件块结构表之间。\n[0187] 此时,更新文件的文件结构列表中各文件块结构表按照先后顺序即为:文件块1的文件块结构表、文件块5的文件块结构表、文件块2的文件块结构表。可见已经将长度小于固定长度的文件块5的文件块结构表插入了更新文件的文件结构列表中,并且插入后各文件块结构表的排序与各文件块在更新文件中的排序顺序也是一致的。\n[0188] 另外,生成的该长度小于固定长度的文件块的文件块结构表中也要包括该该长度小于固定长度的文件块的文件块标识、前继文件块的文件块标识、后继文件块的文件块标识、起始位置、长度、弱校验值和强校验值,因此,生成该长度小于固定长度的文件块的文件块结构表的方法具体为:为该长度小于固定长度的文件块分配文件块标识,确定该前一个文件块结构表对应的文件块的文件块标识,作为该长度小于固定长度的文件块的前继文件块的文件块标识,确定该待匹配块的文件块标识,作为该长度小于固定长度的文件块的后继文件块的文件块标识,将该前一个文件块结构表对应的文件块的最后一个字节的下一个字节作为该长度小于固定长度的文件块的起始位置;生成包含该长度小于固定长度的文件块的文件块标识、前继文件块的文件块标识、后继文件块的文件块标识、起始位置、长度、弱校验值和强校验值的文件块结构表。\n[0189] 并且,由于客户端是将生成的该长度小于固定长度的文件块的文件块结构表插入到当前更新文件的文件结构列表中该前一个文件块结构表和当前待匹配块的文件块结构表之间,因此插入后需要修改该前一个文件块结构表中的后继文件块的文件块标识,以及当前待匹配块的文件块结构表中的前继文件块标识。具体的,将生成的该长度小于固定长度的文件块的文件块结构表插入到更新文件的文件结构列表中该前一个文件块结构表和该待匹配块的文件块结构表之间后,将该前一个文件块结构表中的后继文件块的文件块标识修改为该长度小于固定长度的文件块的文件块标识,将该待匹配块的文件块结构表中的前继文件块的文件块标识修改为该长度小于固定长度的文件块的文件块标识。\n[0190] 继续沿用上例,生成文件块5的文件块结构表时,为文件块5分配文件块标识,将文件块1的文件块标识作为文件块5的前继文件块的文件块标识,将文件块2的文件块标识作为文件块5的后继文件块的文件块标识,将文件块1的最后一个字节的下一个字节作为该文件块5的起始位置,生成的该文件块5的文件块结构表中包含文件块5的文件块标识、前继文件块(文件块1)的文件块标识、后继文件块(文件块2)的文件块标识、起始位置、长度、弱校验值和强校验值的文件块结构表。\n[0191] 并且,由于在对长度小于固定长度的文件块5进行上述判断处理过程之前,更新文件的文件块列表中各文件块结构表按照先后顺序为:文件块1的文件块结构表和文件块2的文件块结构表,因此,文件块1的文件块结构表中记录的后继文件块的文件块标识为文件块\n2的文件块标识,文件块2的文件块结构表中记录的前继文件块的文件块标识为文件块1的文件块标识。而将生成的文件块5的文件块结构表插入到文件块1和文件块2的文件块结构表之间后,就需要将文件块1的文件块结构表中的后继文件块的文件块标识修改为文件块5的文件块标识,将文件块2的文件块结构表中的前继文件块的文件块标识修改为文件块5的文件块标识,以正确表示各文件块的先后顺序。\n[0192] 情况四、如图10所示。\n[0193] 图10为本申请实施例提供的第三种更新文件和原文件的对比示意图,在图10中,更新文件相当于是在原文件的文件块1和文件块2之间又插入了一个长度大于固定长度S,但小于两倍固定长度2S的文件块6,新增的文件块6相当于是由一个长度为固定长度的文件块4和一个长度小于固定长度的文件块5构成的文件块。\n[0194] 当客户端中的更新文件以及服务器中保存的原文件如图10所示时,客户端首先按照与情况一基本相同的方法对更新文件中的文件块1进行判断处理,将文件块1的文件块结构表(上传标记为不上传)插入到更新文件中的末尾,并将文件块1的下一个字节(文件块4的第一个字节)重新确定为起点,将更新文件中重新确定的起点开始的固定长度的文件块重新确定为待匹配块,并计算重新确定的待匹配块的弱校验值和强校验值,返回步骤S703。\n[0195] 之后,客户端按照与情况二基本相同的方法对长度为固定长度的文件块4进行判断处理,生成文件块4的文件块结构表(上传标记为上传),并插入到更新文件中的末尾(文件块1的文件块结构表之后)。\n[0196] 再后,客户端按照与情况三基本相同的方法,先对文件块2进行判断处理,生成文件块2的文件块结构表(上传标记为不上传),并插入到更新文件中的末尾(文件块4的文件块结构表之后),再对文件块4和文件块2之间的长度小于固定长度的文件块5进行判断处理,生成文件块5的文件块结构表(上传标记为上传),并插入到文件块4的文件块结构表和文件块2的文件块结构表之间。\n[0197] 由此可见,采用本申请实施例中的增量同步方法,在更新文件中的两个固定长度的文件块之间,允许存在一个长度小于固定长度的文件块,相比于现有技术基于rsync算法的增量同步方法中只允许最后一个文件块的长度小于固定长度,本申请实施例提供的增量同步方法可以更加灵活的调整文件结构,便于在分布式存储场景中对文件中的各文件块进行存储。\n[0198] 情况五、如图11所示。\n[0199] 图11为本申请实施例提供的第四种更新文件和原文件的对比示意图,在图11中,原文件包括文件块1、文件块2、文件块3、文件块4,其中,文件块1、文件块2、文件块3的长度为固定长度,文件块4的长度小于固定长度,更新文件相当于是在原文件的文件块3和文件块4之间又插入了一个文件块2,也即更新文件包括两个文件块2,具体为文件块1、文件块2、文件块3、文件块2、文件块4。以下将更新文件中的第一个文件块2称为文件块2a,将新插入的第二个文件块2称为文件块2b。\n[0200] 当客户端中的更新文件以及服务器中保存的原文件如图11所示时,客户端首先按照与情况一基本相同的方法依次对更新文件中的文件块1、文件块2a、文件块3进行判断处理,依次将文件块1、文件块2a、文件块3的文件块结构表插入到更新文件的文件结构列表的末尾,其中,文件块1、文件块2a、文件块3的文件块结构表的上传标记均为不上传。\n[0201] 在对文件块2b进行判断处理时,由于在步骤S701中提取的原文件中各文件块的文件块结构表中存在文件块2的文件块结构表,而原文件中文件块2的文件块结构表既与更新文件中的文件块2a匹配,也与更新文件中的文件块2b匹配,因此,在对文件块2b进行步骤S703的判断时,判断结果仍然为是,说明服务器中已经保存了该文件块2b(原文件中的文件块2)。但是,服务器中保存的原文件的文件结构列表描述的原文件的结构中并未包含两个文件块2,而是只包含一个文件块2,包含的即为更新文件中的文件块2a,因此为了保证增量同步的准确性,客户端通过对生成的各待匹配块的文件块结构表设置操作状态来告知服务器调整相应的文件结构列表,以改变原文件的结构,使其与更新文件一致。\n[0202] 具体的,当判断提取的每个文件块结构表中存在至少一个与该待匹配块匹配的文件块结构表时,生成该待匹配块的文件块结构表的方法具体为:按照该至少一个与该待匹配块匹配的文件块结构表在原文件的文件结构列表中的排序顺序,在至少一个与该待匹配块匹配的文件块结构表中,依次查找未建立匹配关系的文件块结构表,建立查找到的第一个文件块结构表与该待匹配块的匹配关系;当与该待匹配块具有匹配关系的文件块结构表中包含的前继文件块的文件块标识,与生成的该待匹配块的文件块结构表中的前继文件块的文件块标识相同时,将生成的该待匹配块的文件块结构表的操作状态设置为完成状态;\n当与该待匹配块具有匹配关系的文件块结构表中包含的前继文件块的文件块标识,与生成的该待匹配块的文件块结构表中的前继文件块的文件块标识不同时,将生成的该待匹配块的文件块结构表的操作状态设置为移动状态;当在该至少一个与该待匹配块匹配的文件块结构表中未查找到未建立匹配关系的文件块结构表时,将生成的该待匹配块的文件块结构表的操作状态设置为插入状态。\n[0203] 继续以图11为例进行说明,当客户端按照与情况一基本相同的方法对作为待匹配块的更新文件中的文件块1进行判断处理时,由于提取的文件块结构表中与待匹配块匹配的文件块结构表只有一个(原文件中文件块1的文件块结构表),因此建立待匹配块与原文件中文件块1的文件块结构表的匹配关系,又因为原文件中文件块1的文件块结构表中记录的前继文件块的文件块标识,与生成的待匹配块(更新文件中文件块1)的文件块标识中记录的前继文件块的文件块标识相同,因此将该待匹配块的文件块结构表的操作状态设置为完成状态,当然,该待匹配块的文件块结构表的上传标记为不上传。\n[0204] 上传标记为不上传,且操作状态为完成状态的文件块结构表表示对应的文件块已经保存在服务器的原文件中,且该文件块在原文件中的位置也不需要改变,因此不需要上传该文件块,也不需要服务器调整原文件中该文件块的文件块结构表。\n[0205] 相应的,客户端在按照与情况一基本相同的方法依次对文件块2a、文件块3进行判断处理时,也将文件块2a和文件块3对应的文件块结构表的上传标记设置围不上传,并将操作状态设置为完成状态。也即,更新文件中文件块1、文件块2a、文件块3均不需要上传,而且服务器也不需要调整原文件中文件块1、文件块2、文件块3的文件块结构表。\n[0206] 当客户端按照与情况一基本相同的方法对作为待匹配块的更新文件中的文件块\n2b进行判断处理时,由于提取的文件块结构表中与待匹配块匹配的文件块结构表为原文件中文件块2的文件块结构表,而由于原文件中文件块2的文件块结构表已经于更新文件中的文件块2a建立了匹配关系,因此虽然步骤S701中提取的文件块结构表中存在一个与文件块\n2b匹配的文件块结构表,但是未查找到与文件块2b匹配、且未建立匹配关系的文件块结构表,从而将该待匹配块的文件块结构表的操作状态设置为插入状态,将该待匹配块的文件块结构表的上传标记设置为不上传。\n[0207] 上传标记为不上传,且操作状态为插入状态的文件块结构表表示对应的文件块已经保存在服务器的原文件中,不需要上传该文件块,但是该文件块是更新文件中新加入的与原文件中某个文件块相同的文件块,因此需要服务器调整原文件的文件结构列表,将该文件块结构表插入到原文件的文件结构列表中的相应位置,并建立已保存的该文件块与该文件块结构表的关系,以更新原文件。\n[0208] 当客户端按照与情况一基本相同的方法对作为待匹配块的更新文件中的文件块4进行判断处理时,由于提取的文件块结构表中与待匹配块匹配的文件块结构表即为原文件中文件块4的文件块结构表,因此建立待匹配块与原文件中文件块4的文件块结构表的匹配关系。而由于原文件中文件块4的文件块结构表中记录的前继文件块的文件块标识为文件块3的文件块标识,该待匹配块(更新文件中的文件块4)的文件块结构表中记录的前继文件块的文件块标识为文件块2b的文件块标识,因此将该待匹配块的文件块结构表的操作状态设置为移动状态,当然,该待匹配块的文件块结构表的上传标记为不上传。\n[0209] 上传标记为不上传,且操作状态为移动状态的文件块结构表表示对应的文件块已经保存在服务器的原文件中,不需要上传该文件块,但是该文件块在更新文件中的位置与在原文件中的位置不同,因此需要服务器调整原文件的文件结构列表中该文件块的文件块结构表的位置(调整为与该文件块结构表在更新文件的文件结构列表中的位置一致),以更新原文件。\n[0210] 另外,如果针对更新文件中的某个文件块,在进行步骤S703的判断时,判断结果为否,并循环执行步骤S705、S706、S708、S709、S703若干次后,在步骤S706中的判断结果为是,也即按照情况二的方法生成某个文件块的文件块结构表,将该文件块的文件块结构表的上传标记设置为上传时,也要将生成的该文件块的文件块结构表的操作状态设置为插入状态,表示服务器保存的原文件中并不存在该文件块,原文件的文件结构列表中也不存在该文件块的文件块结构表,因此需要上传该文件块,并将该文件块的文件块结构表插入到原文件的文件结构列表中的相应位置,以更新原文件。\n[0211] 情况六、如图12所示。\n[0212] 图12为本申请实施例提供的第五种更新文件和原文件的对比示意图,在图12中,原文件包括文件块1、文件块2、文件块3,更新文件相当于是删除了原文件中的文件块2。\n[0213] 当客户端中的更新文件以及服务器中保存的原文件如图12所示时,客户端按照与情况一基本相同的方法依次对更新文件中的文件块1和文件块3进行判断处理时,建立步骤S701中提取的原文件中文件块1的文件块结构表与更新文件中的文件块1的匹配关系,建立步骤S701中提取的原文件中文件块3的文件块结构表与更新文件中的文件块3的匹配关系。\n[0214] 显然,依次生成更新文件中的文件块1和文件块3的文件块结构表并插入更新文件的文件结构列表中后,客户端需要告知服务器将原文件中文件块2的文件块结构表删除,并删除文件块2的文件块结构表与保存的文件块2的对应关系。需要说明的是,这里客户端并不是告知服务器将保存的文件块2删除的原因在于,由于服务器中对相同的文件块只保存一次,但相同的文件块可能存在与不同的文件中,因此如果直接将该文件块2删除,那么保存的其他包含该文件块2的文件就会出错,因此仅告知服务器将原文件的文件结构列表中该文件块2的文件块结构表删除,并删除原文件中该文件块2的文件块列表与保存的该文件块2的对应关系,并不删除保存的该文件块2。\n[0215] 具体的,客户端在提取的原文件的文件结构列表中的每个文件块结构表中,确定未建立匹配关系的文件块结构表,将未建立匹配关系的文件块结构表中的操作状态设置为删除状态。\n[0216] 并且,在将更新文件中的所有文件块的文件块结构表都插入到更新文件的文件结构列表中后,向服务器发送更新文件的文件结构列表的方法具体为:将更新文件的文件结构列表以及原文件的文件结构列表中操作状态为删除状态的文件块结构表发送给服务器,使服务器根据接收到的各文件块结构表的操作状态更新原文件的文件结构列表。\n[0217] 基于上述情况五和情况六对文件块结构表的操作状态进行设置的方法,服务器接收到更新文件的文件结构列表以及操作状态为删除状态的文件块结构表后,针对操作状态为完成状态的文件块结构表,则对原文件的相应文件块结构表不做任何操作;针对操作状态为插入状态的文件块结构表,则将该操作状态为插入状态的文件块结构表插入到原文件的文件结构列表中;针对操作状态为移动状态的文件块结构表,则调整原文件的相应文件块结构表在原文件的文件结构列表中的位置;针对操作状态为删除状态的文件块结构表,则删除原文件的文件结构列表中相应的文件块结构表。这样,服务器就将原文件的文件结构列表更新成了该更新文件的文件结构列表,在后续步骤中,服务器则可以存储客户端发送的文件块,完成更新文件的同步。\n[0218] 以上是当客户端中的文件被更新时,采用第二种增量同步方法对服务器中的原文件进行更新的六种情况(情况一~情况六),本领域技术人员应该可以理解,在实际应用中,可以根据更新文件和原文件的具体情况,采用上述六种情况下的处理方法中的任何一种或几种的组合进行处理。\n[0219] 另外,为了进一步提高增量同步的效率,在图7所示的第二种增量同步的过程中,通过以下两种方法计算某个文件块的弱校验值。\n[0220] 方法一、在步骤S702中将更新文件的第一个字节确定为起点,确定从该起点开始的固定长度的文件块为待匹配块时,确定待匹配块的弱校验值,以及,在步骤S703中的判断结果为是并执行步骤S704后,步骤S709中计算重新确定的待匹配块的弱校验值的方法如下:\n[0221] 采用公式 确定待匹配块的弱校验值的低16位,其中,k表示\n更新文件的第k个字节为待匹配块的起点,l表示更新文件的第l个字节为待匹配块的最后一个字节,Xi为更新文件中的第i个字节,a(k,l)为确定的待匹配块的弱校验值的低16位;\n采用公式 确定待匹配块的弱校验值的高16位,其中,b(k,l)\n为确定的待匹配块的弱校验值的高16位;根据确定的待匹配块的弱校验值的低16位和高16位,采用公式s(k,l)=a(k,l)+216b(k,l)确定待匹配块的弱校验值,其中,s(k,l)为确定的待匹配块的弱校验值。\n[0222] 方法二、在步骤S703中的判断结果为否并执行步骤S708后,步骤S709中计算重新确定的待匹配块的弱校验值的方法如下:\n[0223] 采用公式a(k+1,l+1)=(a(k,l)-Xk+Xl+1)mod216确定重新确定的待匹配块的弱校验值的低16位,其中,k+1表示更新文件的第k+1个字节为重新确定的待匹配块的起点,l+1表示更新文件的第l+1个字节为重新确定的待匹配块的最后一个字节,a(k+1,l+1)为重新确定的待匹配块的弱校验值的低16位;采用公式b(k+1,l+1)=(b(k,l)-(l-k+1)Xk+a(k+1,l+1))mod216确定重新确定的待匹配块的弱校验值的高16位,其中,b(k+1,l+1)为重新确定的待匹配块的弱校验值的高16位;采用公式s(k+1,l+1)=a(k+1,l+1)+216b(k+1,l+1)确定重新确定的待匹配块的弱校验值,其中,s(k+1,l+1)为重新确定的待匹配块的弱校验值。\n[0224] 根据上述方法二中用于计算弱校验值低16位和高16位的公式可见,当将当前起点的下一个字节重新确定为起点后,计算重新确定的待匹配块的弱校验值时,可以直接根据上一次确定的待匹配块的弱校验值进行简单的运算得到,而无需采用如方法一相对比较复杂的运算得到,因此可以提高确定弱校验值的效率,进而提高同步增量的效率。\n[0225] 另外,当采用如上述情况三所述的方法对位于两个固定长度的文件块之间的长度小于固定长度的文件块进行判断处理时,确定该长度小于固定长度的文件块的弱校验值时,采用方法一进行确定。\n[0226] 并且,在确定某个文件块的强校验值时,可以将该文件块的MD5值作为该文件块的强校验值,这里就不再一一赘述。\n[0227] 本申请实施例中客户端将更新文件中所有文件块的文件块结构表插入到更新文件的文件结构列表中时,在将更新文件的文件结构列表发送给服务器之后,将所有上传标记为上传的文件块结构表对应的文件块发送给服务器之前,也可以接收服务器发送的调整后的文件结构列表,再根据调整后的文件结构列表中各文件块结构表中的上传标记,将上传标记为上传的文件块结构表对应的文件块发送给服务器。服务器调整更新文件的文件结构列表具体为:针对接收到的文件结构列表中上传标记为上传的文件块结构表,如果该文件块结构表中记录的文件块的强校验值与自身保存的某个文件块的强校验值匹配,则将该文件块结构表的上传标记调整为不上传。\n[0228] 这是因为步骤S703中客户端查找的是原文件的文件结构列表中各文件块结构表是否与当前作为待匹配块的文件块匹配,判断结果为否时才将相应生成的文件块结构表的上传标记设置为上传。而步骤S703的判断结果为否只能说明服务器保存的原文件中并不包括该文件块,并不能说明服务器保存的其他文件中也不包括该文件块,而如果其他文件中包含该文件块,则该文件块同样不需要上传,只需要将该文件块的文件块结构表插入到原文件的文件结构列表中的相应位置,并建立该文件块结构表与保存的该文件块建立对应关系即可。\n[0229] 以上是当客户端中的文件被更新时,应用于将客户端中的更新文件同步到服务器中的第二种增量同步方法。下面对当服务器中的文件被更新时,应用于将服务器中的更新文件同步到客户端中的第三种增量同步方法进行详细描述。\n[0230] 本申请实施例中的第三种增量同步方法旨在使服务器将更新文件增量同步到客户端中时,仍然不需要服务器进行任何文件块的弱校验值和强校验值的计算。因此,第三种增量同步方法也基于上述第一种增量同步方法,也即服务器中针对存储的每个文件都保存有相应的文件结构列表,以描述存储的相应文件的结构。\n[0231] 当服务器中的文件被更新后,服务器同样保存了更新后的文件的文件结构列表,保存了未更新的文件的客户端在检测到服务器中相应的文件被更新时,将更新后的文件增量同步到自身的过程如图13所示。\n[0232] 图13为本申请实施例提供的第三种增量同步的过程,具体包括以下步骤:\n[0233] S1301:客户端在检测到服务器中保存的文件被更新时,将自身保存的该文件作为原文件,获取服务器中保存的该原文件对应的更新文件的文件结构列表,并提取客户端自身保存的该原文件的文件结构列表。\n[0234] 在本申请实施例中,服务器中保存的文件被更新可能是其他客户端中保存的相应文件被更新时,其他客户端将更新文件作为新增的文件并采用本申请实施例提供的上述第一种增量同步方法更新到服务器中的,也可能是其他客户端中保存的相应文件被更新时,其他客户端采用本申请实施例提供的上述第二种增量同步方法更新到服务器中的,无论是采用哪种方法,服务器中都会保存更新文件的文件结构列表。\n[0235] 而此时,保存未更新的文件(原文件)的该客户端中保存的仍然是原文件的文件结构列表,因此客户端一方面从服务器中获取更新文件的文件结构列表,另一方面提取自身保存的原文件的文件结构列表。\n[0236] S1302:将提取的原文件的文件结构列表中的每个文件块结构表作为每个待匹配表,针对每个待匹配表,在该更新文件的文件结构列表中查找与该待匹配表匹配的文件块结构表。\n[0237] 由于在服务器中获取的更新文件的文件结构列表中的各文件块结构表记录了更新文件中相应各文件块的弱校验值和强校验值,而客户端自身保存的原文件的文件结构列表中的各文件块结构表也记录了原文件中相应各文件块的弱校验值和强校验值,因此,客户端将原文件的每个文件块结构表作为待匹配表,针对每个待匹配表,在更新文件的文件结构列表中查找与该待匹配表匹配的文件块结构表。\n[0238] 其中,与该待匹配表匹配的文件块结构表为:记录的弱校验值与该待匹配表的弱校验值匹配,且,记录的强校验值与该待匹配表记录的强校验值匹配的文件块结构表。\n[0239] S1303:将查找到的与该待匹配表匹配的文件块结构表标记为已匹配,并将与该待匹配表对应的原文件的文件块写入到新建存储区域中。\n[0240] 针对某个待匹配表,如果在更新文件的文件结构列表中查找到与该待匹配表匹配的文件块结构表,则说明客户端中已经保存了更新文件中该文件块结构表对应的文件块,因此不需要向服务器请求下载该文件块。因此将查找到的与该待匹配表匹配的文件块结构表标记为已匹配,并将保存的原文件中该待匹配表对应的文件块写入到新建存储区域中,其中,该新建存储区域可以是缓存区。\n[0241] S1304:将更新文件的文件结构列表中未标记为已匹配的文件块结构表返回服务器,接收服务器发送的各未标记为已匹配的文件块结构表对应的文件块,根据新建存储区域中写入的文件块和接收到的服务器发送的文件块更新该原文件。\n[0242] 针对每个待匹配表(客户端自身保存的原文件的文件结构列表中的每个文件块结构表)都进行了上述步骤S1303的操作后,更新文件的文件结构列表中未标记为已匹配的文件块结构表对应的文件块即为客户端中未保存的更新文件中的文件块,这些文件块就需要向服务器请求下载,因此将未标记为已匹配的文件块结构表返回服务器,服务器则发送各未标记为已匹配的文件块结构表对应的文件块。客户端接收到服务器发送的文件块后,由于更新文件的文件结构列表中标记为已匹配的各文件块结构表对应的文件块已经写入到新建存储区域,因此可以根据新建存储区域中写入的文件块和接收到的服务器发送的文件块更新该原文件。\n[0243] 下面以下述几种情况详细说明本申请实施例的第三种增量同步过程。\n[0244] 情况A、如图14所示。\n[0245] 图14为本申请实施例提供的第六种更新文件和原文件的对比示意图,在图14中,服务器中保存的是更新文件,客户端中保存的是原文件,原文件包括文件块1、文件块2,更新文件相当于是在文件块2之后加入了文件块3。\n[0246] 当客户端中保存的原文件以及服务器中的更新文件如图14所示时,步骤S1301中客户端获取的更新文件的文件结构列表中包括文件块1、文件块2、文件块3的文件块结构表,而客户端自身保存的原文件的文件结构列表中包括文件块1、文件块2的文件块结构表。\n[0247] 在步骤S1302中,客户端将原文件中文件块1的文件块结构表作为待匹配表,在获取的更新文件的文件结构列表中,查找到更新文件中文件块1的文件块结构表与待匹配表匹配。从而,在步骤S1303中,将更新文件中文件块1的文件块结构表标记为已匹配,并将原文件中的文件块1写入到新建存储区域中。\n[0248] 相应的,客户端将原文件中文件块2的文件块结构表作为待匹配表,在获取的更新文件的文件结构列表中,查找到更新文件中文件块2的文件块结构表与待匹配表匹配。从而,将更新文件中文件块2的文件块结构表标记为已匹配,并将原文件中的文件块2写入到新建存储区域中。\n[0249] 然后,在步骤S1304中,由于获取的更新文件的文件结构列表中,更新文件中文件块3的文件块结构表未标记为已匹配,因此向服务器发送文件块3的文件块结构表,服务器则返回相应的文件块3,客户端则根据新建存储区域中已写入的文件块1和文件块2,以及接收到的文件块3,更新原文件。\n[0250] 情况B、如图15所示。\n[0251] 图15为本申请实施例提供的第七种更新文件和原文件的对比示意图,在图15中,服务器中保存的是更新文件,客户端中保存的是原文件,原文件包括文件块1、文件块2、文件块3,更新文件相当于是删除了原文件中的文件块3。\n[0252] 当客户端中保存的原文件以及服务器中的更新文件如图15所示时,步骤S1301中客户端获取的更新文件的文件结构列表中包括文件块1、文件块2的文件块结构表,而客户端自身保存的原文件的文件结构列表中包括文件块1、文件块2、文件块3的文件块结构表。\n[0253] 与情况A类似的,客户端将原文件中文件块1的文件块结构表作为待匹配表时,在获取的更新文件的文件结构列表中,查找到更新文件中文件块1的文件块结构表与待匹配表匹配。从而,将更新文件中文件块1的文件块结构表标记为已匹配,并将原文件中的文件块1写入到新建存储区域中。客户端将原文件中文件块2的文件块结构表作为待匹配表时,在获取的更新文件的文件结构列表中,查找到更新文件中文件块2的文件块结构表与待匹配表匹配。从而,将更新文件中文件块2的文件块结构表标记为已匹配,并将原文件中的文件块2写入到新建存储区域中。\n[0254] 当客户端将原文件中文件块3的文件块结构表作为待匹配表时,由于更新文件中并不包含文件块3,因此更新文件的文件结构列表中并不包含文件块3的文件块结构表,从而客户端在获取的更新文件的文件结构列表中未查找到与待匹配表匹配的文件块结构表。\n因此,客户端针对原文件中的文件块3不作任何处理。\n[0255] 此时,由于更新文件的文件结构列表中的所有文件块结构表(文件块1的文件块结构表和文件块2的文件块结构表)均已标记为已匹配,因此不存在要向服务器发送的未标记为已匹配的文件块结构表,从而,客户端根据新建存储区域中已写入的文件块1和文件块2,更新原文件。\n[0256] 情况C、如图16所示。\n[0257] 图16为本申请实施例提供的第八种更新文件和原文件的对比示意图,在图16中,服务器中保存的是更新文件,客户端中保存的是原文件,原文件包括文件块1、文件块2,更新文件相当于是在文件块2之后又加入了一个相同的文件块2。以下将更新文件中的第一个文件块2称为文件块2a,将第二个文件块2称为文件块2b。\n[0258] 当客户端中保存的原文件以及服务器中的更新文件如图16所示时,步骤S1301中客户端获取的更新文件的文件结构列表中包括文件块1、文件块2a、文件块2b的文件块结构表,而客户端自身保存的原文件的文件结构列表中包括文件块1、文件块2的文件块结构表。\n[0259] 客户端将原文件中文件块1的文件块结构表作为待匹配表时,在获取的更新文件的文件结构列表中,查找到更新文件中文件块1的文件块结构表与待匹配表匹配。从而,将更新文件中文件块1的文件块结构表标记为已匹配,并将原文件中的文件块1写入到新建存储区域中。\n[0260] 当客户端将原文件中文件块2的文件块结构表作为待匹配表时,在获取的更新文件的文件结构列表中,查找到更新文件中文件块2a的文件块结构表与待匹配表匹配,文件块2b的文件块结构表也与待匹配表匹配,而如果将文件块2a和文件块2b的文件块结构表均标记为已匹配,那么在后续的步骤中,客户端将不会将服务器请求下载任何文件块,直接通过在新建存储区域中写入的文件块1和文件块2更新原文件,显然这会漏掉一个文件块2。\n[0261] 因此,本申请实施例中为了提高增量同步的准确性,针对待匹配表,当在更新文件的文件结构列表中查找到两个以上与待匹配表匹配的文件块结构表时,只将查找到的其中的一个文件块结构表标记为已匹配。\n[0262] 继续沿用上例,当客户端将原文件中文件块2的文件块结构表作为待匹配表时,查找到更新文件中文件块2a和文件块2b的文件块结构表与待匹配表匹配,因此只将其中的一个文件块结构表标记为已匹配,例如将文件块2a的文件块结构表标记为已匹配,并将原文件中的文件块2写入到新建存储区域中。\n[0263] 在后续的步骤中,由于更新文件中文件块2b的文件块结构表未标记为已匹配,因此向服务器发送未标记为已匹配的该文件块2b的文件块结构表,以请求下载文件块2b,并根据新建存储区域中已写入的文件块1和文件块2,以及接收到的文件块2b,更新原文件。\n[0264] 或者,客户端也可以同时将更新文件中文件块2a和文件块2b的文件块结构表标记为已匹配,并确定更新文件中与该待匹配表(原文件中文件块2的文件块结构表)匹配的文件块结构表的个数(2个),将该个数(2个)的该待匹配表对应的文件块(原文件中的文件块\n2)写入到新建存储区域中即可,而无需向服务器请求下载相同的文件块。\n[0265] 情况D、如图17所示。\n[0266] 图17为本申请实施例提供的第九种更新文件和原文件的对比示意图,在图17中,服务器中保存的是更新文件,客户端中保存的是原文件,原文件包括文件块1和两个文件块\n2,更新文件相当于是删除了原文件中的一个文件块2。以下将原文件中的第一个文件块2称为文件块2a,将第二个文件块2称为文件块2b。\n[0267] 当客户端中保存的原文件以及服务器中的更新文件如图17所示时,步骤S1301中客户端获取的更新文件的文件结构列表中包括文件块1、文件块2的文件块结构表,而客户端自身保存的原文件的文件结构列表中包括文件块1、文件块2a、文件块2b的文件块结构表。\n[0268] 客户端将原文件中文件块1的文件块结构表作为待匹配表时,在获取的更新文件的文件结构列表中,查找到更新文件中文件块1的文件块结构表与待匹配表匹配。从而,将更新文件中文件块1的文件块结构表标记为已匹配,并将原文件中的文件块1写入到新建存储区域中。\n[0269] 当客户端将原文件中文件块2a的文件块结构表作为待匹配表时,在获取的更新文件的文件结构列表中,查找到更新文件中文件块2的文件块结构表与待匹配表匹配。从而,将更新文件中文件块2的文件块结构表标记为已匹配,并将原文件中的文件块2a写入到新建存储区域中。\n[0270] 而当客户端将原文件中文件块2b的文件块结构表作为待匹配表时,在获取的更新文件的文件结构列表中,仍然查找到更新文件中文件块2的文件块结构表与待匹配表匹配,如果在后续步骤中将原文件中的文件块2b写入到新建存储区域中,则最后客户端就会根据新建存储区域中已写入的文件块1、文件块2a、文件块2b更新原文件,显然这会多增加一个文件块2。\n[0271] 因此,本申请实施例中为了提高增量同步的准确性,步骤S1302中客户端在更新文件的文件结构列表中查找与待匹配表匹配的文件块结构表的方法具体为,在更新文件的文件结构列表中查找:记录的弱校验值与该待匹配表记录的弱校验值匹配,且,记录的强校验值与该待匹配表记录的强校验值匹配,且,未标记为已匹配的文件块结构表。若查找到满足上述条件的文件块结构表,查找到的该文件块结构表即为与该待匹配表匹配的文件块结构表,若未查找到满足上述条件的文件块结构表,则确定未查找到与该待匹配表匹配的文件块结构表。\n[0272] 继续沿用上例,当客户端将原文件中文件块2a的文件块结构表作为待匹配表时,在获取的更新文件的文件结构列表中,查找到更新文件中文件块2的文件块结构表与待匹配表匹配,假设此时更新文件中文件块2的文件块结构表未标记为已匹配,则将更新文件中文件块2的文件块结构表标记为已匹配,并将原文件中的文件块2a写入到新建存储区域中。\n[0273] 当客户端将原文件中文件块2b的文件块结构表作为待匹配表时,虽然更新文件中文件块2的文件块结构表记录的弱校验值和强校验值与待匹配表记录的弱校验值和强校验值匹配,但是该更新文件中文件块2的文件块结构表已经被标记为已匹配,因此确定未查找到与作为当前待匹配表的文件块2b的文件块结构表匹配的文件块结构表,不对该文件块2b进行任何操作。\n[0274] 从而,在后续步骤中,由于更新文件的文件结构列表中所有文件块结构表(更新文件中文件块1和文件块2的文件块结构表)均已标记为已匹配,因此不向服务器请求下载任何文件块,根据新建存储区域中已写入的文件块1和文件块2a,更新原文件。\n[0275] 情况E、如图18所示。\n[0276] 图18为本申请实施例提供的第十种更新文件和原文件的对比示意图,在图18中,服务器中保存的是更新文件,客户端中保存的是原文件,原文件包括文件块1、文件块4、文件块2、文件块5,更新文件相当于是删除了原文件中的文件块4和文件块5,并增加了文件块\n3。\n[0277] 当客户端中保存的原文件以及服务器中的更新文件如图18所示时,步骤S1301中客户端获取的更新文件的文件结构列表中包括文件块1、文件块2、文件块3的文件块结构表,而客户端自身保存的原文件的文件结构列表中包括文件块1、文件块4、文件块2、文件块\n5的文件块结构表。\n[0278] 与上述情况A和情况B类似的,客户端将更新文件中文件块1和文件块2的文件块结构表标记为已匹配,并将原文件中的文件块1和文件块2写入到新建存储区域中。\n[0279] 然后,客户端则可以向服务器请求下载更新文件中的文件块3,并根据新建存储区域中已写入的的文件块1和文件块2,以及接收到的文件块3更新原文件。\n[0280] 但是,如图18所示,如果更新文件中的文件块3实际上是由原文件中文件块4的后几个字节和文件块5的前几个字节构成的,那么实际上客户端并不需要向服务器请求下载文件块3,而只需将文件块4和文件块5拼接在一起之后,在拼接后的文件中提取出文件块3并写入新建存储区域即可。\n[0281] 因此,本申请实施例中为了尽量降低客户端向服务器请求下载的数据量,以节省网络资源,在图13所示的步骤S1304之前,也即将更新文件的文件结构列表中未标记为已匹配的文件块结构表返回服务器之前,还要进行如图19所示的过程,以确定原文件中除了写入到新建存储区域中的文件块以外的各文件块拼接后,是否存在与更新文件中相同的文件块并进行相应处理。\n[0282] 图19为本申请实施例提供的在图13所示的步骤S1304之前客户端进行的判断处理过程,具体包括以下步骤:\n[0283] S1901:确定原文件中除了写入到新建存储区域中的文件块之外的各文件块,将确定的各文件块按照各文件块在原文件中的排序顺序进行前后拼接,得到拼接文件。\n[0284] S1902:将得到的该拼接文件的第一个字节确定为起点,确定从该起点开始的固定长度的文件块为待匹配块,确定该待匹配块的弱校验值和强校验值。\n[0285] S1903:判断该更新文件的文件结构列表中是否存在至少一个与该待匹配块匹配的文件块结构表,若判断结果为是,则执行步骤S1904,否则执行步骤S1905。\n[0286] 其中,与该待匹配块匹配的文件块结构表为:记录的弱校验值与该待匹配块的弱校验值匹配,且,记录的强校验值与该待匹配块的强校验值匹配的文件块结构表。\n[0287] S1904:将该待匹配块写入到新建存储区域中,并将与该待匹配块匹配的文件块结构表标记为已匹配,将该拼接文件中该待匹配块的下一个字节重新确定为起点,执行步骤S1906。\n[0288] S1905:将该拼接文件中该起点的下一个字节重新确定为起点,执行步骤S1906。\n[0289] S1906:将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,计算重新确定的待匹配块的弱校验值和强校验值,并返回步骤S1903。\n[0290] 也即,将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,并继续判断更新文件的文件结构列表中是否存在至少一个与重新确定的待匹配块匹配的文件块结构表,直至得到该拼接文件的最后一个字节所在的待匹配块的判断结果并执行相应操作为止。\n[0291] S1907:当得到拼接文件的最后一个字节所在的待匹配块的判断结果并执行相应操作后,执行如图13所示的步骤S1304。\n[0292] 也即,当得到拼接文件的最后一个字节所在的待匹配块的判断结果并执行相应操作后,将更新文件的文件结构列表中未标记为已匹配的文件块结构表返回服务器,接收服务器发送的各未标记为已匹配的文件块结构表对应的文件块,根据新建存储区域中写入的文件块和接收到的服务器发送的文件块更新该原文件。\n[0293] 其中,为了尽量节省存储资源,降低计算量,在步骤S1901中,客户端将确定的各文件块按照各文件块在原文件中的排序顺序进行前后拼接,得到拼接文件的方法具体可以为:按照确定的各文件块在原文件中的排序顺序,连续的读出满足后续计算所需要的文件块即可。也即,最多需要连续读出的长度为两倍的固定长度。\n[0294] 继续以图18为例进行说明,客户端将更新文件中文件块1和文件块2的文件块结构表标记为已匹配,并将原文件中的文件块1和文件块2写入到新建存储区域中后,在步骤S1901中确定的原文件中除了写入到新建存储区域中的文件块之外的文件块即为文件块4和文件块5,而文件块4和文件块5在原文件中的排序顺序即为文件块4在前,文件块5在后,因此将文件块4和文件块5拼接后得到的拼接文件即为由文件块4和文件块5按照文件块4在前、文件块5在后的方式前后拼接得到的文件。\n[0295] 在步骤S1902中客户端先将该拼接文件的第一个字节,也即文件块4的第一个字节确定为起点,确定的从该起点开始的固定长度的文件块即为文件块4,也即当前文件块4是待匹配块,确定该文件块4的弱校验值和强校验值。\n[0296] 由于更新文件中并不包含文件块4,也即更新文件的文件结构列表中不包括记录的弱校验值和强校验值与该文件块4的弱校验值和强校验值匹配的文件块结构表,因此在步骤S1903中客户端的判断结果为否,执行步骤S1905。\n[0297] 在步骤S1905中,客户端将当前起点的下一个字节,也即文件块4的第二个字节重新确定为起点,并在步骤S1906中,将从重新确定的起点开始的固定长度的文件块确定为待匹配块,因此,重新确定的待匹配块即为从文件块4的第二个字节到文件块5的第一个字节的文件块,重新确定待匹配块后,计算重新确定的待匹配块的弱校验值和强校验值,返回步骤S1903,继续对重新确定的待匹配块进行判断处理。\n[0298] 假设更新文件中的文件块3实际上就是由文件块4的第二个字节到文件块4的最后一个字节,以及文件块5的第一个字节所构成的,那么,返回步骤S1903后,确定更新文件的文件结构列表中文件块3的文件块结构表与该重新确定的待匹配块匹配,因此步骤S1903的判断结果即为是,执行步骤S1904。\n[0299] 在步骤S1904中,则将当前待匹配块(从文件块4的第二个字节到文件块5的第一个字节的文件块)写入到新建存储区域中,并将与该重新确定的待匹配块匹配的文件块结构表(更新文件中文件块3的文件块结构表)标记为已匹配。\n[0300] 在后续步骤中,客户端则继续将拼接文件中当前待匹配块(从文件块4的第二个字节到文件块5的第一个字节的文件块)的下一个字节,也即文件块5的第二个字节重新确定为起点,而由于从文件块5的第二个字节为起点到拼接文件的末尾已经不足固定长度,因此直接将重新确定的起点(文件块5的第二个字节)到拼接文件的末尾的文件块重新确定为待匹配块即可,并循环执行上述步骤S1903~S1906,直至得到该拼接文件中的所有文件块的判断结果并执行相应操作为止。\n[0301] 当已得到该拼接文件中的所有文件块的判断结果并执行相应操作后,此时新建存储区域中写入的各文件块即为:文件块1、文件块2、从文件块4的第二个字节到文件块5的第一个字节的文件块(也即文件块3),而更新文件的文件结构列表中所有文件块结构表(文件块1、文件块2、文件块3的文件块结构表)均已标记为已匹配,因此客户端无需向服务器请求下载任何文件块,直接根据新建存储区域中保存的文件块1、文件块2、从文件块4的第二个字节到文件块5的第一个字节的文件块(也即文件块3)更新原文件。\n[0302] 另外,与本申请实施例提供的第二种增量同步方法中的情况三类似的,在如图19所示的过程中,为了避免在拼接文件中将两个长度为固定长度的文件块之间的长度小于固定长度的文件块漏掉,在步骤S1903中,针对当前确定的待匹配块,当判断存在至少一个与当前确定的待匹配块匹配的文件块结构表时,将该拼接文件中当前确定的待匹配块的下一个字节重新确定为起点之前,还要确定该拼接文件中上一个被写入到新建存储区域中的待匹配块,如果拼接文件中该当前确定的待匹配块与上一个被写入到新建存储区域中的待匹配块之间存在一个长度小于固定长度的文件块,则确定该长度小于固定长度的文件块的弱校验值和强校验值;当更新文件的文件结构列表中存在至少一个与该长度小于固定长度的文件块匹配的文件块结构表时,将该长度小于固定长度的文件块写入到新建存储区域中,并将与该长度小于固定长度的文件块匹配的文件块结构表标记为已匹配。如果更新文件的文件结构列表中不存在于该长度小于固定长度的文件块匹配的文件块结构表,则不对该长度小于固定长度的文件块进行任何处理。\n[0303] 当对该长度小于固定长度的文件块进行判断处理后,再将该当前确定的待匹配块的下一个字节重新确定为起点,并进行后续步骤。\n[0304] 情况F、如图20所示。\n[0305] 图20为本申请实施例提供的第十一种更新文件和原文件的对比示意图,在图20中,服务器中保存的是更新文件,客户端中保存的是原文件,原文件包括文件块1、文件块2、两个文件块4、两个文件块5,共6个文件块,这6个文件块按照先后顺序依次为:文件块1、文件块4、文件块2、文件块5、文件块4、文件块5。以下将原文件中的第一个文件块4称为文件块\n4a,第二个文件块4称为文件块4b,将原文件中的第一个文件块5称为文件块5a,第二个文件块5称为文件块5b。更新文件相当于是删除了原文件中的文件块4a、文件块4b、文件块5a、文件块5b,并增加了一个文件块3。\n[0306] 当客户端中保存的原文件以及服务器中的更新文件如图20所示时,步骤S1301中客户端获取的更新文件的文件结构列表中包括文件块1、文件块2、文件块3的文件块结构表,而客户端自身保存的原文件的文件结构列表中包括文件块1、文件块4a、文件块2、文件块5a、文件块4b、文件块5b的文件块结构表。\n[0307] 与上述情况A和情况B类似的,客户端将更新文件中文件块1和文件块2的文件块结构表标记为已匹配,并将原文件中的文件块1和文件块2写入到新建存储区域中。\n[0308] 对于原文件中除了已经写入到新建存储区域中的文件块1和文件块2以外的文件块4a、文件块5a、文件块4b、文件块5b,则按照如图19所示的过程中的步骤S1901进行前后拼接,得到拼接文件。仍假设更新文件中的文件块3是由文件块4的第二个字节到文件块4的最后一个字节,以及文件块5的第一个字节所构成的,那么在得到拼接文件后,在循环执行如图19所示的步骤S1903~S1906时,由于拼接文件中的各文件块按先后顺序为:文件块4a、文件块5a、文件块4b、文件块5b,也即存在两个文件块4和两个文件块5,因此,当以拼接文件中的文件块4a的第二个字节到文件块5a的第一个字节的文件块为待匹配块时,客户端确定更新文件中文件块3的文件块结构表与该待匹配块匹配,因此将该拼接文件中文件块4a的第二个字节到文件块5a的第一个字节的文件块(文件块3)写入到新建存储区域中,而当以拼接文件中的文件块4b的第二个字节到文件块5b的第一个字节的文件块为待匹配块时,客户端又确定更新文件中文件块3的文件块结构表与该待匹配块匹配,因此将该拼接文件中文件块4b的第二个字节到文件块5b的第一个字节的文件块(文件块3)写入到新建存储区域中,显然,这会重复写入一个文件块3。\n[0309] 本申请实施例为了进一步提高增量同步的准确性,在图19所示的步骤S1903中,客户端确定更新文件的文件结构列表中存在至少一个与待匹配块匹配的文件块结构表的方法具体为,确定该更新文件的文件结构列表中存在至少一个记录的弱校验值与该待匹配块的弱校验值匹配,且,记录的强校验值与该待匹配块的强校验值匹配,且,未标记为已匹配的文件块结构表。\n[0310] 继续以图20进行说明,客户端将原文件中的文件块1和文件块2写入到新建存储区域中后,按照图19所示的步骤S1901将写入到新建存储区域中的文件块1和文件块2以外的文件块4a、文件块5a、文件块4b、文件块5b进行前后拼接,得到拼接文件。\n[0311] 在循环执行如图19所示的步骤S1903~S1906的过程中,当以拼接文件中的文件块\n4a的第二个字节到文件块5a的第一个字节的文件块为待匹配块时,客户端确定更新文件中文件块3的文件块结构表记录的弱校验值和强校验值与该待匹配块的弱校验值和强校验值匹配,并且文件块3的文件块结构表未标记为已匹配,因此确定文件块3的文件块结构表与该待匹配块匹配,将该拼接文件中文件块4a的第二个字节到文件块5a的第一个字节的文件块(文件块3)写入到新建存储区域中,并将更新文件中文件块3的文件块结构表标记为已匹配。\n[0312] 当以拼接文件中的文件块4b的第二个字节到文件块5b的第一个字节的文件块为待匹配块时,客户端确定更新文件中文件块3的文件块结构表记录的弱校验值和强校验值与该待匹配块匹配,但是该文件块3的文件块结构表已经标记为已匹配,因此确定该文件块\n3的文件块结构表与该待匹配块不匹配,更新文件的文件结构列表中不存在与该待匹配块匹配的文件块结构表,因此不对该拼接文件中的文件块4b的第二个字节到文件块5b的第一个字节的文件块进行任何处理。\n[0313] 从而,在后续步骤中,由于更新文件的文件结构列表中所有文件块结构表(更新文件中文件块1、文件块2和文件块3的文件块结构表)均已标记为已匹配,因此不向服务器请求下载任何文件块,根据新建存储区域中已写入的文件块1、文件块2、以及该拼接文件中的文件块4b的第二个字节到文件块5b的第一个字节的文件块(文件块3),更新原文件。\n[0314] 以上是当服务器中的文件被更新时,采用第三种增量同步方法对客户端中的原文件进行更新的六种情况(情况A~情况F),本领域技术人员应该可以理解,在实际应用中,可以根据更新文件和原文件的具体情况,采用上述六种情况下的处理方法中的任何一种或几种的组合进行处理。\n[0315] 在本申请实施例中,在图13所示的步骤S1303中,客户端将与该待匹配表对应的原文件的文件块写入到新建存储区域中时,是根据与该待匹配表匹配的文件块结构表在该更新文件的文件结构列表中的位置,将与该待匹配表对应的原文件的文件块写入到新建存储区域中的相应位置上的。\n[0316] 例如,客户端在建立新建存储区域时,可以根据更新文件的文件结构列表中各文件块结构表进行建立,例如根据各文件块结构表记录的相应文件块长度的和值,建立长度为该和值的新建存储区域,并按照更新文件的文件结构列表中各文件块结构表记录的相应文件块长度进行划分。假设更新文件的文件结构列表中与该待匹配表匹配的文件块结构表具体为该更新文件的文件结构列表中的第3个文件块结构表,则客户端将该待匹配表对应的原文件的文件块写入到新建存储区域中第3个文件块的位置上。\n[0317] 类似的,在图19所示的步骤S1904中,客户端将待匹配块写入到新建存储区域中时,是根据与该待匹配块匹配的文件块结构表在该更新文件的文件结构列表中的位置,将该待匹配块写入到新建存储区域中的相应位置上的。并且,在将长度小于固定长度的文件块写入到新建存储区域中时,也是根据与该长度小于固定长度的文件块匹配的文件块结构表在更新文件的文件结构列表中的位置,将该长度小于固定长度的文件块写入到新建存储区域中的相应位置上的。\n[0318] 客户端在根据新建存储区域中写入的文件块和接收到的服务器发送的文件块更新原文件的方法具体为:针对接收到的服务器发送的文件块,根据服务器发送的文件块对应的文件块结构表在更新文件的文件结构列表中的位置,将服务器发送的文件块写入到新建存储区域中的相应位置上,并将新建存储区域中各文件块构成的文件作为更新文件保存,删除原文件,并保存获取到的更新文件的文件结构列表。\n[0319] 另外,在图19所示的步骤S1902中,当将得到的拼接文件的第一个字节确定为起点,确定从该起点开始的固定长度的文件块为待匹配块时,确定该待匹配块的弱校验值的方法,以及,在步骤S1903中的判断结果为是并执行步骤S1904后,步骤S1906中计算重新确定的待匹配块的弱校验值的方法,以及,确定拼接文件中两个固定长度的文件块之间的长度小于固定长度的文件块的弱校验值的方法,均可以根据第二种增量同步中确定弱校验值的方法一进行确定。在图19所示的过程中,在步骤S1903中的判断结果为否并执行步骤S1905后,步骤S1906中计算重新确定的待匹配块的弱校验值的方法,可以根据第二种增量同步中确定弱校验值的方法二进行确定,这里就不再一一赘述。\n[0320] 以上是当服务器中的文件被更新时,应用于将服务器中的更新文件同步到客户端中的第三种增量同步方法。\n[0321] 可见,本申请实施例提供的三种增量同步方法中,无论是客户端中的文件被更新,还是服务器中的文件被更新,均无需服务器进行弱校验值和强校验值的计算,也不需要服务器执行新旧文件匹配的步骤,只需服务器保存包括各文件块结构表的文件结构列表即可,因此在分布式存储场景中可以极大的减轻服务器的压力。\n[0322] 图21为本申请实施例提供的增量同步的装置结构示意图,具体包括:\n[0323] 分割模块2101,用于在检测到自身存在新增的文件时,将所述文件分割成连续、不重叠的文件块,除最后一个文件块之外,其余文件块的长度为固定长度,并且最后一个文件块的长度不大于所述固定长度;\n[0324] 第一生成模块2102,用于分别针对分割的每个文件块,确定该文件块的弱校验值和强校验值,并生成该文件块对应的文件块结构表,生成的文件块结构表中记录了该文件块的弱校验值和强校验值;\n[0325] 发送模块2103,用于将各文件块结构表作为所述文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器进行存储。\n[0326] 所述第一生成模块2102还用于,为分割的每个文件块分配文件块标识;针对每个文件块,根据分割的各文件块在所述文件中的排序顺序,确定与该文件块相邻且排在该文件块之前的前继文件块的文件块标识,确定与文件块相邻且排在该文件块之后的后继文件块的文件块标识,将该文件块的文件块标识、确定的前继文件块的文件块标识、后继文件块的文件块标识记录在该文件块对应的文件块结构表中。\n[0327] 所述发送模块2103具体用于,按照每个文件块在所述文件中的排序顺序,将每个文件块对应的文件块结构表进行排序,将排序后的各文件块结构表作为所述文件的文件结构列表发送给服务器保存。\n[0328] 所述装置还包括:\n[0329] 第一提取模块2104,用于在检测到自身保存的所述文件被更新时,将自身保存的更新后的文件作为更新文件,获取服务器中保存的所述更新文件对应的原文件的文件结构列表,提取所述原文件的文件结构列表中的每个文件块结构表;\n[0330] 判断处理模块2105,用于将所述更新文件的第一个字节确定为起点,确定从所述起点开始的固定长度的文件块为待匹配块,确定所述待匹配块的弱校验值和强校验值;判断提取的每个文件块结构表中是否存在至少一个与所述待匹配块匹配的文件块结构表,其中,与所述待匹配块匹配的文件块结构表为:记录的弱校验值与所述待匹配块的弱校验值匹配,且,记录的强校验值与所述待匹配块的强校验值匹配的文件块结构表;若是,则生成所述待匹配块的文件块结构表,将生成的文件块结构表中的上传标记设置为不上传,并插入到所述更新文件的文件结构列表中的末尾,将所述更新文件中所述待匹配块的下一个字节重新确定为起点;否则,确定当前所述更新文件的文件结构列表中排在末尾的文件块结构表对应的文件块的最后一个字节,判断从确定的最后一个字节的下一个字节到所述起点的长度是否达到所述固定长度,若达到,则生成确定的最后一个字节的下一个字节到所述起点的文件块的文件块结构表,将生成的文件块结构表中的上传标记设置为上传,并插入到所述更新文件的文件结构列表中的末尾,将所述更新文件中所述起点的下一个字节重新确定为起点,若未达到,则将所述更新文件中所述起点的下一个字节重新确定为起点;将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,继续判断提取的每个文件块结构表中是否存在至少一个与重新确定的待匹配块匹配的文件块结构表,直至将所述更新文件中所有文件块的文件块结构表插入到所述更新文件的文件结构列表中为止;\n[0331] 所述发送模块2103还用于,将所述更新文件的文件结构列表发送给所述服务器保存,以更新所述服务器中保存的所述原文件的文件结构列表,并将所述更新文件的文件结构列表中每个上传标记为上传的文件块结构表对应的文件块发送给服务器进行存储,完成所述更新文件的同步。\n[0332] 所述装置还包括:\n[0333] 第二提取模块2106,用于在检测到服务器中保存的所述文件被更新时,将自身保存的所述文件作为原文件,获取服务器中保存的所述原文件对应的更新文件的文件结构列表,并提取所述客户端自身保存的所述原文件的文件结构列表;\n[0334] 查找模块2107,用于将提取的所述原文件的文件结构列表中的每个文件块结构表作为每个待匹配表,针对每个待匹配表,在所述更新文件的文件结构列表中查找与该待匹配表匹配的文件块结构表,其中,与该待匹配表匹配的文件块结构表为:记录的弱校验值与该待匹配表记录的弱校验值匹配,且,记录的强校验值与该待匹配表记录的强校验值匹配的文件块结构表;\n[0335] 处理模块2108,用于将查找到的与该待匹配表匹配的文件块结构表标记为已匹配,并将与该待匹配表对应的所述原文件的文件块写入到新建存储区域中;\n[0336] 发送模块2103,用于将所述更新文件的文件结构列表中未标记为已匹配的文件块结构表返回所述服务器,并接收所述服务器发送的各未标记为已匹配的文件块结构表对应的文件块,根据所述新建存储区域中写入的文件块和接收到的服务器发送的文件块更新所述原文件。\n[0337] 具体的上述增量同步的装置可以位于客户端中。\n[0338] 图22为本申请实施例提供的增量同步的系统结构示意图,具体包括:\n[0339] 客户端2201,用于在检测到自身存在新增的文件时,将所述文件分割成连续、不重叠的文件块,除最后一个文件块之外,其余文件块的长度为固定长度,并且最后一个文件块的长度不大于所述固定长度;分别针对分割的每个文件块,确定该文件块的弱校验值和强校验值,并生成该文件块对应的文件块结构表,生成的文件块结构表中记录了该文件块的弱校验值和强校验值;将各文件块结构表作为所述文件的文件结构列表发送给服务器\n2202,并将各文件块发送给服务器2202;\n[0340] 服务器2202,用于保存接收到的所述文件结构列表,存储接收到的各文件块。\n[0341] 所述客户端2201还用于在检测到自身保存的所述文件被更新时,将自身保存的更新后的文件作为更新文件,获取服务器2202中保存的所述更新文件对应的原文件的文件结构列表,提取所述原文件的文件结构列表中的每个文件块结构表;将所述更新文件的第一个字节确定为起点,确定从所述起点开始的固定长度的文件块为待匹配块,确定所述待匹配块的弱校验值和强校验值;判断提取的每个文件块结构表中是否存在至少一个与所述待匹配块匹配的文件块结构表,其中,与所述待匹配块匹配的文件块结构表为:记录的弱校验值与所述待匹配块的弱校验值匹配,且,记录的强校验值与所述待匹配块的强校验值匹配的文件块结构表;若是,则生成所述待匹配块的文件块结构表,将生成的文件块结构表中的上传标记设置为不上传,并插入到所述更新文件的文件结构列表中的末尾,将所述更新文件中所述待匹配块的下一个字节重新确定为起点;否则,确定当前所述更新文件的文件结构列表中排在末尾的文件块结构表对应的文件块的最后一个字节,判断从确定的最后一个字节的下一个字节到所述起点的长度是否达到所述固定长度,若达到,则生成确定的最后一个字节的下一个字节到所述起点的文件块的文件块结构表,将生成的文件块结构表中的上传标记设置为上传,并插入到所述更新文件的文件结构列表中的末尾,将所述更新文件中所述起点的下一个字节重新确定为起点,若未达到,则将所述更新文件中所述起点的下一个字节重新确定为起点;将从重新确定的起点开始的固定长度的文件块重新确定为待匹配块,继续判断提取的每个文件块结构表中是否存在至少一个与重新确定的待匹配块匹配的文件块结构表,直至将所述更新文件中所有文件块的文件块结构表插入到所述更新文件的文件结构列表中为止;将所述更新文件的文件结构列表发送给所述服务器2202,并将所述更新文件的文件结构列表中每个上传标记为上传的文件块结构表对应的文件块发送给服务器2202;\n[0342] 服务器2202,用于接收所述客户端2201发送的所述更新文件的文件结构列表,采用所述更新文件的文件结构列表更新所述原文件的文件结构列表,接收所述客户端2201发送的文件块并存储,完成所述更新文件的同步。\n[0343] 所述客户端2201还用于,在检测到服务器2202中保存的所述文件被更新时,将自身保存的所述文件作为原文件,获取服务器2202中保存的所述原文件对应的更新文件的文件结构列表,并提取所述客户端2201自身保存的所述原文件的文件结构列表;将提取的所述原文件的文件结构列表中的每个文件块结构表作为每个待匹配表,针对每个待匹配表,在所述更新文件的文件结构列表中查找与该待匹配表匹配的文件块结构表,其中,与该待匹配表匹配的文件块结构表为:记录的弱校验值与该待匹配表记录的弱校验值匹配,且,记录的强校验值与该待匹配表记录的强校验值匹配的文件块结构表;将查找到的与该待匹配表匹配的文件块结构表标记为已匹配,并将与该待匹配表对应的所述原文件的文件块写入到新建存储区域中;将所述更新文件的文件结构列表中未标记为已匹配的文件块结构表返回所述服务器2202,并接收所述服务器2202发送的各未标记为已匹配的文件块结构表对应的文件块,根据所述新建存储区域中写入的文件块和接收到的服务器2202发送的文件块更新所述原文件;\n[0344] 服务器2202,用于向所述客户端2201提供所述更新文件的文件结构列表,接收所述客户端2201返回的未标记为已匹配的文件块结构表,将未标记为已匹配的文件块结构表对应的文件块发送给所述服务器2202。\n[0345] 本申请实施例提供一种增量同步的方法、装置及系统,该方法客户端在检测到自身存在新增的文件时,将该文件分割成若干个文件块,并确定各文件块的弱校验值和强校验值,将确定的弱校验值和强校验值记录在相应的文件块对应的文件块结构表中,将各文件块的文件块结构表作为该文件的文件结构列表发送给服务器保存,并将各文件块发送给服务器存储,以完成该新增文件的同步。通过上述方法,在后续的增量同步过程中,如果服务器中保存的该文件是旧文件,则服务器无需计算各文件块的弱校验值和强校验值,直接从各文件块结构表中提取相应各文件块的弱校验值和强校验值即可,因此减轻了服务器的负担。\n[0346] 显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
法律信息
- 2016-12-14
- 2013-12-25
实质审查的生效
IPC(主分类): H04L 29/08
专利申请号: 201210157295.4
申请日: 2012.05.18
- 2013-12-04
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2011-03-23
|
2010-11-17
| | |
2
| |
2011-01-12
|
2010-08-09
| | |
3
| |
2011-08-17
|
2011-04-01
| | |
4
| |
2011-05-18
|
2010-12-31
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |