CN102790760B - 安全网盘***中一种基于目录树的数据同步方法 - Google Patents
安全网盘***中一种基于目录树的数据同步方法 Download PDFInfo
- Publication number
- CN102790760B CN102790760B CN201210179530.8A CN201210179530A CN102790760B CN 102790760 B CN102790760 B CN 102790760B CN 201210179530 A CN201210179530 A CN 201210179530A CN 102790760 B CN102790760 B CN 102790760B
- Authority
- CN
- China
- Prior art keywords
- node
- directory tree
- client
- file
- record
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 51
- 230000008569 process Effects 0.000 claims abstract description 19
- 238000012986 modification Methods 0.000 claims description 17
- 230000004048 modification Effects 0.000 claims description 17
- 230000001360 synchronised effect Effects 0.000 claims description 17
- 230000006870 function Effects 0.000 claims description 16
- 230000008676 import Effects 0.000 claims description 16
- 230000008034 disappearance Effects 0.000 claims description 14
- 230000007246 mechanism Effects 0.000 abstract description 3
- 241000396836 Trinodes Species 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 230000002688 persistence Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
安全网盘***中基于目录树的数据同步方法属于多机同步领域,尤其涉及其中文件同步领域。本发明的特征在于客户端只需要保存一颗客户端目录树就可以完成同步,提高了存储效率;服务器端通过目录树就可以知道云端数据的实时情况,减少了***开销;产生同步操作的过程中仅进行了两次目录树比对和一次结果比对,提高了数据同步的效率;整个数据同步的过程与数据本身的内容无关,保证了同步过程中数据的安全性,因此可以适用于任何具有安全机制的网盘***中。
Description
技术领域
基于目录树的数据同步方法属于多机同步领域,尤其涉及其中文件同步领域。
背景技术
数据同步是指同一份数据在不同的存储设备或终端与服务器、终端与终端之间的备份操作。目前,在网盘***中使用较多的数据同步方法是SyncML协议和Rsync方法。SyncML是一种平台无关的信息同步标准协议,它基于平台无关的XML语言,可以在若干网络,平台及设备间进行一个开放的,全行业规范的普遍的远程数据及个人信息同步。Rsync方法是一种增量上传的同步方法,通过比对文件块的哈希值作为判断依据执行同步操作。但是,随着云存储的发展,越来越多的人开始认可并使用云存储服务来存放自己的私密数据,云存储***的安全性要求也与日俱增。作为云存储的重要应用之一,网盘***随着安全机制的添加,使用传统的基于SyncML协议或Rsync方法的数据同步方式在同步的效率和复杂性方面都存在着一定的不足。
发明内容
本发明的目的是设计一种新的数据同步方法,使得网盘***中的客户端与服务器之间在添加了安全机制的情况下能够正确的、高效的进行数据同步。
为达到这一目的,本发明提出了一种基于目录树的数据同步方法,它的特征在于:由客户端向服务器发起同步请求,服务器验证客户端身份后将它保存在服务器端的服务器端目录树(Sever Directory Tree)返回给客户端,客户端将服务器端目录树、客户端目录树(ClientDirectory Tree)和磁盘目录树(Disk Directory Tree)进行比对,再根据比对的结果生成相应的操作队列进行操作,完成数据同步的过程。
本发明的特征在于,它是在由客户端计算机、服务器以及云存储服务器三者共同构成的基于个人用户共享的安全网络存储***CorsBox中实现的,所述客户端计算机和服务器之间通过Internet网连接,所述服务器和云存储服务器之间通过以太网交换机连接,所述安全网盘***中一种基于同步目录树的数据同步方法依次含有以下步骤:
步骤(1),客户端计算机初始化所有目录树:
步骤(1.1),客户端计算机向服务器发起同步请求,服务器计算机对客户端的用户身份进行验证,然后将该用户的服务器端目录树返回给客户端;
步骤(1.2),客户端计算机读取保存在本地的客户端目录树生成文件,在内存中创造了该用户的客户端目录树和组成所述用户的客户端目录树的客户端目录树结点:
客户端目录树是一个二叉树结构,它的格式包括:root、nodes、nodesCount和maxnodesCount,其中,
nodes,以数组方式记录了所述客户端目录树的所有结点;
nodesCount,记录了所述客户端目录树中的总结点数;
maxNodesCount,表示所述客户端目录树最多允许包含的结点数;
客户端目录树结点的格式包括:nodeType、name、appendAttribute、lastModifyTime、lchild和rchild,其中:
nodeType,记录所述客户端目录树中的结点所对应的是目录还是文件;
name,记录所述客户端目录树中所述目录或文件的名称;
appendAttribute,对所述客户端目录树中的目录而言,记录的是是否被共享,对所述客户端目录树中的文件而言,记录的是最新版本的版本号;
lchild,记录了在所述客户端目录树中该结点的左孩子的索引号;
rchild,记录了在所述客户端目录树中该结点的右孩子的索引号;
lastModifytime,记录所述基于个人用户共享安全网络存储***CorsBox所维护的该结点的最新修改时间;
步骤(1.3),客户端计算机根据步骤(1.1)的返回的服务器端目录树在内存中创建该用户的服务器端目录树,用于记录所述云存储服务器中的实时数据状态;用户的服务器端目录树的结构与客户端目录树完全相同,只是nodes数组中的结点类型是用户服务器端目录树结点,用户服务器端目录树结点包括:nodeType、name、appendAttribute、lchild和rchild,其中:
nodeType,记录所述用户服务器端目录树中的结点所对应的是目录或文件;
name,记录所述的目录或文件的名称;
appendAttribute,对所述用户服务器端目录树中的目录而言,记录的是是否被共享,对所述用户服务器端目录树中的文件而言,记录的是最新版本的版本号;
lchild,记录了在所述用户服务器端目录树中该结点的左孩子的索引号;
rchild,记录了在所述用户服务器端目录树中该结点的右孩子的索引号;
步骤(1.4),所述客户端计算机在每次同步时扫描磁盘中的所述客户端目录树的目录及其子目录,在内存中创造用户磁盘目录树记录用户的实时数据,用户磁盘目录树的结构与客户端目录树完全相同,只是nodes数组中的结点类型是磁盘目录树结点,用户磁盘目录树结点包括:nodeType、name、lastModifyTime、lchild和rchild,其中:
nodeType,记录所述用户磁盘目录树中的结点所对应的是目录还是文件;
name,记录所述磁盘目录树中所述目录或文件的名称;
lastModifytime,记录了在所述客户端计算机中该结点的最后修改时间;
lchild,记录了在所述磁盘目录树中该结点的左孩子的索引号;
rchild,记录了在所述磁盘目录树中该结点的右孩子的索引号;
步骤(2),客户端计算机依次按照如下步骤比对客户端目录树与磁盘目录树;
步骤(2.1),客户端计算机将客户端目录树排序,排序方法如下:
步骤(2.1.1),创建一个当前结点指针指向客户端目录树的根节点,若当前结点为空,则排序完成,否则使用步骤(2.1.2)中的方法进行排序;
步骤(2.1.2),对待当前结点的左孩子对应的右结点链,某个结点的右节点链定义为一个集合,该集合包含该节点及其右孩子、右孩子的右孩子……,直到右孩子为空,按照字典序的方式顺序排序,对字符串来说,字典序是指:若A字符串的首字母在字典中顺序排在字符串B的首字母之前,则称在字典序中A>B,若想相等则比较第二个字母,以此类推;
步骤(2.1.3),将当前结点指针依次指向其左孩子的右结点链中的每一个结点,若该结点的类型为目录,则递归执行步骤(2.1.1),若为文件则直接跳过;
步骤(2.2),客户端计算机将磁盘目录树排序,排序方法与步骤(2.1)一样;
步骤(2.3),客户端计算机依次按照如下步骤比对客户端目录树与磁盘目录树,生成比对结果:
步骤(2.3.1),分别设置客户端目录树的当前结点指针CDT和磁盘目录树的当前结点指针DDT,然后将CDT指向客户端目录树的根节点,DDT当前指针指向磁盘目录树的根节点;
步骤(2.3.2),对客户端目录树与服务器端目录树中当前结点指针各自所指向的结点使用(2.3.2.1)中的方法进行结点比对;
步骤(2.3.2.1),若CDT当前所指向的结点和DDT当前所指向的结点中,有且仅有一个为空,则在比对结果数组CDTvsDDT中增加一个元素记录该路径下为空的那颗目录树缺失结点,并返回;
若CDT当前所指向的结点和DDT当前所指向的结点均为空,则直接返回;
若CDT当前所指向的结点和DDT当前所指向的结点均不为空,则按字典序比对两个当前结点中name域的值:若CDT指向的结点中name域的值较大,则将DDT指向其右孩子,转步骤(2.3.2);反之则将CDT指向其右孩子,转步骤(2.3.2);
若CDT当前所指向的结点和DDT当前所指向的结点的name域值相同,即:依照字典序比较,结果为等于,则比对两个结点中的lastModifyTime域的值:
若lastModifyTime域的值不相同,则在比对结果数组CDTvsDDT中增加一个元素记录当前结点所代表的文件的最后修改时间不同,并转步骤(2.3.3);
若lastModifyTime域的值相同,则直接转步骤(2.3.3);
步骤(2.3.3),将CDT和DDT分别指向各自的左孩子结点,然后调用步骤(2.3.2)所对应的函数继续执行,待该函数返回后,再将CDT与DDT分别指向刚进入步骤(2.3.3)时的节点,并接着执行步骤(2.3.4);
步骤(2.3.4),将CDT和DDT分别指向各自的右孩子结点,然后调用步骤(2.3.2)所对应的函数继续执行,待该函数返回后,再接着执行步骤(2.3.5);
步骤(2.3.5),当执行到这一步的时候,客户端目录树与磁盘目录树已将整棵树比对完毕,并将所有缺失的结点与最后修改时间不相同的结点信息都已记录在比对结果数组CDTvsDDT中;
步骤(3),客户端比对客户端目录树与服务器端目录树:
步骤(3.1),客户端将服务器端目录树排序,排序方法与步骤(2.1)一样;
步骤(3.2),客户端计算机依次按照如下步骤比对客户端目录树与服务器端目录树,生成比对结果:
步骤(3.2.1),分别设置客户端目录树的当前结点指针CDT,和服务器目录树的当前结点指针SDT,然后将CDT指向客户端目录树的根节点,SDT指向服务器端目录树的根节点;
步骤(3.2.2),对客户端目录树与服务器端目录树各自的当前结点指针所指向的结点使用步骤(3.2.2.1)中的方法进行结点比对;
步骤(3.2.2.1),若CDT当前所指向的结点和SDT当前所指向的结点中,有且仅有一个为空,则在比对结果数组CDTvsSDT中增加一个元素记录该路径下为空的那颗目录树缺失结点,并返回;
若CDT当前所指向的结点和SDT当前所指向的结点均为空,则直接返回;
若CDT当前所指向的结点和SDT当前所指向的结点均不为空,则按字典序比对两个当前结点中name域的值:若CDT指向的结点中name域的值较大,则将SDT指向其右孩子,转步骤(3.2.2);反之则将CDT指向其右孩子,转步骤(3.2.2);
若CDT当前所指向的结点和SDT当前所指向的结点的name域值相同,即:依照字典序比较,结果为等于,则比对两个结点中的appendAttribute域的值;
若appendAttribute域的值不相同,则在比对结果数组CDTvsSDT中增加一个元素记录当前结点所代表的文件的版本号不同,并转步骤(3.2.3);
若appendAttribute域的值相同,则直接转步骤(3.2.3);
步骤(3.2.3),将CDT和SDT分别指向各自的左孩子结点,然后调用步骤(3.2.2)所对应的函数继续执行,待该函数返回后,再将CDT与SDT分别指向刚进入步骤(3.2.3)时的节点,并接着执行步骤(3.2.4);
步骤(3.2.4),将CDT和SDT分别指向各自的右孩子结点,然后调用步骤(2.3.2)所对应的函数继续执行,待该函数返回后,再接着执行步骤(2.3.5);
步骤(3.2.5),当执行到这一步的时候,客户端目录树与服务器端目录树已将整棵树比对完毕,并将所有存在结点缺失的路径或文件版本号不同的结点信息都记录在比对结果CDTvsSDT数组当中;
步骤(4),客户端比对步骤(2)和步骤(3)的比对结果,并根据此结果执行相应的同步操作,完成同步过程:
步骤(4.1),将步骤(2)中的比对结果CDTvsDDT数组中的元素按照路径的字典序进行排序;
步骤(4.2),将步骤(3)中的比对结果CDTvsSDT数组中的元素按照路径的字典序进行排序;
步骤(4.3),按照如下步骤依次比对数组CDTvsDDT、CDTvsSDT中的元素,生成需要执行的同步操作;
步骤(4.3.1),数组CDTvsDDT、CDTvsSDT各自的第一个元素作为两个比对结果传入的结点,称为传入结点,进入步骤(4.3.2);
步骤(4.3.2),比对两个传入结点的路径,将比对结果分为以下几种情况考虑:
若步骤(2)中的比对结果传入的结点记录的路径的字典序较小,则根据该结点记录的信息分以下情况考虑,并将步骤(2)中传入结点的下一结点与步骤(3)中的传入结点作为新的传入结点再次从步骤(4.3.2)开始执行;
1.若该结点记录的信息为客户端目录树中存在此结点,而磁盘目录树中不存在此结点,则表示该结点对应文件或目录已被客户端离线删除,因此需要对此路径执行下载操作;
2.若该结点记录的信息为磁盘目录树中存在此结点,而客户端目录树中不存在此结点,则表示该文件或目录是用户在未开启云存储服务客户端的时候增加的,因此需要对此路径执行上传操作;
3.若结点记录的信息为客户端目录树与磁盘目录树中都存在此结点,但它们的最后修改时间不同,则表示用户在未开启云存储服务客户端的时候修改了此文件,而在这段时间内其他客户端并没有提交此文件的新版本至服务器,因此需要对此路径执行上传操作;
若步骤(3)中的比对结果传入的结点记录的路径的字典序较小,则根据该结点记录的信息分以下情况考虑,并将步骤(3)中传入结点的下一结点与步骤(2)中的传入结点作为新的传入结点再次从步骤(4.3.2)开始执行;
1.若该结点记录的信息为客户端目录树中存在此结点,而服务器端目录树中不存在此结点,则表示此文件或目录已被其他客户端删除,应在本地将它删除;
2.若该结点记录的信息为服务器端目录树中存在此结点,而客户端目录树中不存在此结点,则表示此文件或目录是其他客户端上传的,应对此路径执行下载操作;
3.若结点记录的信息为客户端目录树与服务器端目录树中都存在此结点,但它们的版本号不同,则说明其他用户提交了新版本至服务器,而此用户并没有对此文件进行修改,因此需要对此路径执行下载操作;
若步骤(2)中的路径与步骤(3)中的路径一致,则根据两个结点分别记录的信息分以下情况处理,并将两个传入结点的下一结点作为新结点再次从步骤(4.3.2)开始执行;
1.若步骤(2)中结点记录的信息为磁盘目录树缺失结点,而步骤(3)中结点记录的信息为服务器端端目录树缺失结点,则表示此文件或目录已被其他用户删除,同时该用户在为开启云存储服务客户端的情况下也删除了此文件或目录,因此只需将该路径对于的结点从客户端目录树中删除即可;
2.若步骤(2)中结点记录的信息为磁盘目录树缺失结点,而步骤(3)中结点记录的信息为文件版本号不同,则表示其他用户已上传此文件的新版本,而此用户在未开启云存储服务客户端的情况下删除了此文件,因此需要对此路径执行下载操作;
3.若步骤(2)中结点记录的信息为最后修改时间不同,而步骤(3)中结点记录的信息为服务器端端目录树缺失结点,则表示其他用户已将此文件删除,而本地用户在这段时间却对此文件进行了修改,因此需要对此路径执行上传操作;
4.若步骤(2)中结点记录的信息为最后修改时间不同,而步骤(3)中结点记录的信息为版本号不同,则表示其他用户上传了此文件,而本地用户也修改了此文件,因此需要进行冲突处理,具体的方法是将本地文件重命名后上传,并从服务器端下载该文件的最新版本;
步骤(5),依次执行步骤(4)中生成的同步操作,完成同步过程。
本发明在清华大学计算机系高性能计算技术研究所的机基于个人用户共享的安全网络存储***CorsBox中进行了测试与应用。试验结果表明,本发明能够正确的、高效的实现各个客户端与服务器之间的数据同步。
附图说明:
图1目录树及结点的右结点链,其中:图1.1,目录结构的树状结构逻辑组织方式;图1.2,目录树的组织方式,其中share、dir1、dir2三个结点构成了public结点的右结点链。
图2同步方法的整体框架。
图3目录树排序的流程。
图4客户端目录树与磁盘目录树比对的流程。
图5客户端目录树与服务器端目录树比对的流程。
图6对结果再次比对的流程。
具体实施方式
基于个人用户共享的安全网络存储***CorsBox主要由客户端软件,服务器软件及云存储服务平台三部分构成,基于目录树的数据同步方法运行在所述的CorsBox***中。
CorsBox***中,服务器和云存储之间通过以太网交换机连接在一起,客户端与服务器之间通过Internet连接。存放在客户端的目录树叫做客户端目录树,存放在服务器的目录树叫做服务器端目录树,在客户端需要使用时实时扫描磁盘构建的目录树叫做磁盘目录树。
当客户端需要同步时,先向服务器端发送同步请求,服务器端验证用户身份后将其服务器端目录树返回。
服务器端目录树存放在服务器端,用于记录存储服务器中数据状态的实时情况。由于存储服务器只是机械式的存放数据的密文而并不记录数据的状态,服务器端目录树必须跟存储服务器中的实时数据状态保持一致。使用时,直接通过服务器端目录树来代替云端的数据状态。服务器端目录树的结点格式定义如下:
其中nodeType用来记录该结点所对应的是目录还是文件,name用来记录目录名或文件名,appendAttribute属性对目录来说记录的是该目录是否被共享,对文件来说记录的是该文件最新版本的版本号,lChild记录了在服务器端目录树中该结点的左孩子的索引号,rChild记录了该结点右孩子的索引号。
客户端从服务器的返回信息中构建出服务器端目录树,然后根据本地文件构建出客户端目录树,最后通过扫描磁盘的方式构建出磁盘目录树。目录树的格式定义如下:
其中root表示目录树的根节点,nodes以数组的方式记录目录树中的所有结点,nodesCount记录此目录树中共有的结点数,maxNodesCount表示此目录树最多可以包含的结点数(即nodes已分配的空间,根据需要允许扩容)。
客户端目录树存放在客户端,用于记录用户的本地数据的状态与结构。由于用户有可能在并未开启***客户端的情况下对其本地数据进行操作,客户端目录树记录的其实是最近一次用户退出***客户端时候的数据结构状态。客户端目录树结点格式定义如下:
其中lastModifyTime用来记录该结点的最后修改时间,其余的域与服务器端目录树结点的含义一样。
磁盘目录树跟前面两颗目录树有些不太相同,它只是用来记录用户数据的实时情况,以防用户在未开始客户端的情况下对数据进行了操作导致用户数据与客户端目录树不一致,因此不需要持久化,每次同步开始时扫描磁盘进行构建即可。磁盘目录树的格式定义如下:
格式中所有的域的含义与客户端目录树结点的含义一样,但磁盘目录树中记录的是***维护的最新的修改时间,而客户端目录树中记录的是***(客户端)维护最后一次维护时的修改时间。
客户端构建好三颗目录树后按照以下步骤完成同步操作。
步骤(1):将三颗目录树分别排序,其流程如图3所示;
步骤(2):比对客户端目录树和磁盘目录树,并将比对结果保存在CDTvsDDT数组中,其流程如图4所示;
步骤(3):比对客户端目录树和服务器端目录树,并将比对结果保存在CDTvsSDT数组中,其流程如图5所示;
步骤(4):首先将CDTvsDDT和CDTvsSDT数组按照路径的字典序进行排序,然后比对CDTvsDDT和CDTvsSDT中的所有结点,生成操作队列(包含本地删除、上传、下载和冲突处理四种操作),其流程如图6所示;
步骤(5):依次执行操作队列中的每一项操作,完成整个同步过程。
Claims (1)
1.安全网盘***中一种基于目录树的同步方法,其特征在于,它是在由客户端计算机、服务器以及云存储服务器三者共同构成的基于个人用户共享的安全网络存储***CorsBox中实现的,所述客户端计算机和服务器之间通过Internet网连接,所述服务器和云存储服务器之间通过以太网交换机连接,所述安全网盘***中一种基于同步目录树的数据同步方法依次含有以下步骤:
步骤(1),客户端计算机初始化所有目录树:
步骤(1.1),客户端计算机向服务器发起同步请求,服务器计算机对客户端的用户身份进行验证,然后将该用户的服务器端目录树返回给客户端;
步骤(1.2),客户端计算机读取保存在本地的客户端目录树生成文件,在内存中创造了该用户的客户端目录树和组成所述用户的客户端目录树的客户端目录树结点:
客户端目录树是一个二叉树结构,它的格式包括:root、nodes、nodesCount和maxnodesCount,其中,
nodes,以数组方式记录了所述客户端目录树的所有结点;
nodesCount,记录了所述客户端目录树中的总结点数;
maxNodesCount,表示所述客户端目录树最多允许包含的结点数;
客户端目录树结点的格式包括:nodeType、name、appendAttribute、lastModifyTime、lchild和rchild,其中:
nodeType,记录所述客户端目录树中的结点所对应的是目录还是文件;
name,记录所述客户端目录树中所述目录或文件的名称;
appendAttribute,对所述客户端目录树中的目录而言,记录的是是否被共享,对所述客户端目录树中的文件而言,记录的是最新版本的版本号;
lchild,记录了在所述客户端目录树中该结点的左孩子的索引号;
rchild,记录了在所述客户端目录树中该结点的右孩子的索引号;
lastModifytime,记录所述基于个人用户共享安全网络存储***CorsBox所维护的该结点的最新修改时间;
步骤(1.3),客户端计算机根据步骤(1.1)的返回的服务器端目录树在内存中创建该用户的服务器端目录树,用于记录所述云存储服务器中的实时数据状态;用户的服务器端目录树的结构与客户端目录树完全相同,只是nodes数组中的结点类型是用户服务器端目录树结点,用户服务器端目录树结点包括:nodeType、name、appendAttribute、lchild和rchild,其中:
nodeType,记录所述用户服务器端目录树中的结点所对应的是目录或文件;
name,记录所述的目录或文件的名称;
appendAttribute,对所述用户服务器端目录树中的目录而言,记录的是是否被共享,对所述用户服务器端目录树中的文件而言,记录的是最新版本的版本号;
lchild,记录了在所述用户服务器端目录树中该结点的左孩子的索引号;
rchild,记录了在所述用户服务器端目录树中该结点的右孩子的索引号;
步骤(1.4),所述客户端计算机在每次同步时扫描磁盘中的所述客户端目录树的目录及其子目录,在内存中创造用户磁盘目录树记录用户的实时数据,用户磁盘目录树的结构与客户端目录树完全相同,只是nodes数组中的结点类型是磁盘目录树结点,用户磁盘目录树结点包括:nodeType、name、lastModifyTime、lchild和rchild,其中:
nodeType,记录所述用户磁盘目录树中的结点所对应的是目录还是文件;
name,记录所述磁盘目录树中所述目录或文件的名称;
lastModifytime,记录了在所述客户端计算机中该结点的最后修改时间;
lchild,记录了在所述磁盘目录树中该结点的左孩子的索引号;
rchild,记录了在所述磁盘目录树中该结点的右孩子的索引号;
步骤(2),客户端计算机依次按照如下步骤比对客户端目录树与磁盘目录树;
步骤(2.1),客户端计算机将客户端目录树排序,排序方法如下:
步骤(2.1.1),创建一个当前结点指针指向客户端目录树的根节点,若当前结点为空,则排序完成,否则使用步骤(2.1.2)中的方法进行排序;
步骤(2.1.2),对待当前结点的左孩子对应的右结点链,某个结点的右节点链定义为一个集合,该集合包含该节点及其右孩子、右孩子的右孩子……,直到右孩子为空,按照字典序的方式顺序排序,对字符串来说,字典序是指:若A字符串的首字母在字典中顺序排在字符串B的首字母之前,则称在字典序中A>B,若想相等则比较第二个字母,以此类推;
步骤(2.1.3),将当前结点指针依次指向其左孩子的右结点链中的每一个结点,若该结点的类型为目录,则递归执行步骤(2.1.1),若为文件则直接跳过;
步骤(2.2),客户端计算机将磁盘目录树排序,排序方法与步骤(2.1)一样;
步骤(2.3),客户端计算机依次按照如下步骤比对客户端目录树与磁盘目录树,生成比对结果:
步骤(2.3.1),分别设置客户端目录树的当前结点指针CDT和磁盘目录树的当前结点指针DDT,然后将CDT指向客户端目录树的根节点,DDT当前指针指向磁盘目录树的根节点;
步骤(2.3.2),对客户端目录树与服务器端目录树中当前结点指针各自所指向的结点使用(2.3.2.1)中的方法进行结点比对;
步骤(2.3.2.1),若CDT当前所指向的结点和DDT当前所指向的结点中,有且仅有一个为空,则在比对结果数组CDTvsDDT中增加一个元素记录该路径下为空的那颗目录树缺失结点,并返回;
若CDT当前所指向的结点和DDT当前所指向的结点均为空,则直接返回;
若CDT当前所指向的结点和DDT当前所指向的结点均不为空,则按字典序比对两个当前结点中name域的值:若CDT指向的结点中name域的值较大,则将DDT指向其右孩子,转步骤(2.3.2);反之则将CDT指向其右孩子,转步骤(2.3.2);
若CDT当前所指向的结点和DDT当前所指向的结点的name域值相同,即:依照字典序比较,结果为等于,则比对两个结点中的lastModifyTime域的值:
若lastModifyTime域的值不相同,则在比对结果数组CDTvsDDT中增加一个元素记录当前结点所代表的文件的最后修改时间不同,并转步骤(2.3.3);
若lastModifyTime域的值相同,则直接转步骤(2.3.3);
步骤(2.3.3),将CDT和DDT分别指向各自的左孩子结点,然后调用步骤(2.3.2)所对应的函数继续执行,待该函数返回后,再将CDT与DDT分别指向刚进入步骤(2.3.3)时的节点,并接着执行步骤(2.3.4);
步骤(2.3.4),将CDT和DDT分别指向各自的右孩子结点,然后调用步骤(2.3.2)所对应的函数继续执行,待该函数返回后,再接着执行步骤(2.3.5);
步骤(2.3.5),当执行到这一步的时候,客户端目录树与磁盘目录树已将整棵树比对完毕,并将所有缺失的结点与最后修改时间不相同的结点信息都已记录在比对结果数组CDTvsDDT中;
步骤(3),客户端比对客户端目录树与服务器端目录树:
步骤(3.1),客户端将服务器端目录树排序,排序方法与步骤(2.1)一样;
步骤(3.2),客户端计算机依次按照如下步骤比对客户端目录树与服务器端目录树,生成比对结果:
步骤(3.2.1),分别设置客户端目录树的当前结点指针CDT,和服务器目录树的当前结点指针SDT,然后将CDT指向客户端目录树的根节点,SDT指向服务器端目录树的根节点;
步骤(3.2.2),对客户端目录树与服务器端目录树各自的当前结点指针所指向的结点使用步骤(3.2.2.1)中的方法进行结点比对;
步骤(3.2.2.1),若CDT当前所指向的结点和SDT当前所指向的结点中,有且仅有一个为空,则在比对结果数组CDTvsSDT中增加一个元素记录该路径下为空的那颗目录树缺失结点,并返回;
若CDT当前所指向的结点和SDT当前所指向的结点均为空,则直接返回;
若CDT当前所指向的结点和SDT当前所指向的结点均不为空,则按字典序比对两个当前结点中name域的值:若CDT指向的结点中name域的值较大,则将SDT指向其右孩子,转步骤(3.2.2);反之则将CDT指向其右孩子,转步骤(3.2.2);
若CDT当前所指向的结点和SDT当前所指向的结点的name域值相同,即:依照字典序比较,结果为等于,则比对两个结点中的appendAttribute域的值;
若appendAttribute域的值不相同,则在比对结果数组CDTvsSDT中增加一个元素记录当前结点所代表的文件的版本号不同,并转步骤(3.2.3);
若appendAttribute域的值相同,则直接转步骤(3.2.3);
步骤(3.2.3),将CDT和SDT分别指向各自的左孩子结点,然后调用步骤(3.2.2)所对应的函数继续执行,待该函数返回后,再将CDT与SDT分别指向刚进入步骤(3.2.3)时的节点,并接着执行步骤(3.2.4);
步骤(3.2.4),将CDT和SDT分别指向各自的右孩子结点,然后调用步骤(3.2.2)所对应的函数继续执行,待该函数返回后,再接着执行步骤(3.2.5);
步骤(3.2.5),当执行到这一步的时候,客户端目录树与服务器端目录树已将整棵树比对完毕,并将所有存在结点缺失的路径或文件版本号不同的结点信息都记录在比对结果CDTvsSDT数组当中;
步骤(4),客户端比对步骤(2)和步骤(3)的比对结果,并根据此结果执行相应的同步操作,完成同步过程:
步骤(4.1),将步骤(2)中的比对结果CDTvsDDT数组中的元素按照路径的字典序进行排序;
步骤(4.2),将步骤(3)中的比对结果CDTvsSDT数组中的元素按照路径的字典序进行排序;
步骤(4.3),按照如下步骤依次比对数组CDTvsDDT、CDTvsSDT中的元素,生成需要执行的同步操作;
步骤(4.3.1),数组CDTvsDDT、CDTvsSDT各自的第一个元素作为两个比对结果传入的结点,称为传入结点,进入步骤(4.3.2);
步骤(4.3.2),比对两个传入结点的路径,将比对结果分为以下几种情况考虑:
若步骤(2)中的比对结果传入的结点记录的路径的字典序较小,则根据该结点记录的信息分以下情况考虑,并将步骤(2)中传入结点的下一结点与步骤(3)中的传入结点作为新的传入结点再次从步骤(4.3.2)开始执行;
1.若该结点记录的信息为客户端目录树中存在此结点,而磁盘目录树中不存在此结点,则表示该结点对应文件或目录已被客户端离线删除,因此需要对此路径执行下载操作;
2.若该结点记录的信息为磁盘目录树中存在此结点,而客户端目录树中不存在此结点,则表示该文件或目录是用户在未开启云存储服务客户端的时候增加的,因此需要对此路径执行上传操作;
3.若结点记录的信息为客户端目录树与磁盘目录树中都存在此结点,但它们的最后修改时间不同,则表示用户在未开启云存储服务客户端的时候修改了此文件,而在这段时间内其他客户端并没有提交此文件的新版本至服务器,因此需要对此路径执行上传操作;
若步骤(3)中的比对结果传入的结点记录的路径的字典序较小,则根据该结点记录的信息分以下情况考虑,并将步骤(3)中传入结点的下一结点与步骤(2)中的传入结点作为新的传入结点再次从步骤(4.3.2)开始执行;
1.若该结点记录的信息为客户端目录树中存在此结点,而服务器端目录树中不存在此结点,则表示此文件或目录已被其他客户端删除,应在本地将它删除;
2.若该结点记录的信息为服务器端目录树中存在此结点,而客户端目录树中不存在此结点,则表示此文件或目录是其他客户端上传的,应对此路径执行下载操作;
3.若结点记录的信息为客户端目录树与服务器端目录树中都存在此结点,但它们的版本号不同,则说明其他用户提交了新版本至服务器,而此用户并没有对此文件进行修改,因此需要对此路径执行下载操作;
若步骤(2)中的路径与步骤(3)中的路径一致,则根据两个结点分别记录的信息分以下情况处理,并将两个传入结点的下一结点作为新结点再次从步骤(4.3.2)开始执行;
1.若步骤(2)中结点记录的信息为磁盘目录树缺失结点,而步骤(3)中结点记录的信息为服务器端端目录树缺失结点,则表示此文件或目录已被其他用户删除,同时该用户在为开启云存储服务客户端的情况下也删除了此文件或目录,因此只需将该路径对于的结点从客户端目录树中删除即可;
2.若步骤(2)中结点记录的信息为磁盘目录树缺失结点,而步骤(3)中结点记录的信息为文件版本号不同,则表示其他用户已上传此文件的新版本,而此用户在未开启云存储服务客户端的情况下删除了此文件,因此需要对此路径执行下载操作;
3.若步骤(2)中结点记录的信息为最后修改时间不同,而步骤(3)中结点记录的信息为服务器端端目录树缺失结点,则表示其他用户已将此文件删除,而本地用户在这段时间却对此文件进行了修改,因此需要对此路径执行上传操作;
4.若步骤(2)中结点记录的信息为最后修改时间不同,而步骤(3)中结点记录的信息为版本号不同,则表示其他用户上传了此文件,而本地用户也修改了此文件,因此需要进行冲突处理,具体的方法是将本地文件重命名后上传,并从服务器端下载该文件的最新版本;
步骤(5),依次执行步骤(4)中生成的同步操作,完成同步过程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210179530.8A CN102790760B (zh) | 2012-05-31 | 2012-05-31 | 安全网盘***中一种基于目录树的数据同步方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210179530.8A CN102790760B (zh) | 2012-05-31 | 2012-05-31 | 安全网盘***中一种基于目录树的数据同步方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102790760A CN102790760A (zh) | 2012-11-21 |
CN102790760B true CN102790760B (zh) | 2015-04-29 |
Family
ID=47156061
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210179530.8A Active CN102790760B (zh) | 2012-05-31 | 2012-05-31 | 安全网盘***中一种基于目录树的数据同步方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102790760B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108573014A (zh) * | 2017-12-19 | 2018-09-25 | 北京金山云网络技术有限公司 | 一种文件同步方法、装置、电子设备及可读存储介质 |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103037005B (zh) * | 2012-12-21 | 2015-11-25 | 天闻数媒科技(北京)有限公司 | 在线存储服务的文件同步方法和装置 |
CN103559634A (zh) * | 2013-11-07 | 2014-02-05 | 北京国双科技有限公司 | 数据下载处理方法和装置 |
CN103780675B (zh) * | 2013-12-11 | 2017-03-15 | 北京荣之联科技股份有限公司 | 一种云盘文件同步方法和装置 |
CN103713930B (zh) * | 2013-12-31 | 2017-05-24 | 北京荣之联科技股份有限公司 | 一种图形化定义流程地图的方法和装置 |
CN105812432B (zh) * | 2014-12-31 | 2019-03-12 | 北京金山云网络技术有限公司 | 云文档处理方法及装置 |
CN105141681B (zh) * | 2015-08-18 | 2018-07-31 | 北龙中网(北京)科技有限责任公司 | Rpki文件的同步方法及装置 |
CN106657174B (zh) * | 2015-10-28 | 2020-11-03 | 阿里巴巴集团控股有限公司 | 一种数据同步方法、更新方法及装置 |
CN106657170B (zh) * | 2015-10-28 | 2021-03-30 | 斑马智行网络(香港)有限公司 | 一种数据同步方法及装置 |
CN106502927B (zh) * | 2016-10-26 | 2019-08-13 | 北京德普信科技有限公司 | 终端可信计算及数据静态安全***及方法 |
CN108667766B (zh) * | 2017-03-28 | 2020-08-14 | 腾讯科技(深圳)有限公司 | 文件探测方法及文件探测装置 |
CN107577718A (zh) * | 2017-08-10 | 2018-01-12 | 上海斐讯数据通信技术有限公司 | 一种网盘服务器和终端的文件同步的方法和*** |
CN109246221A (zh) * | 2018-09-21 | 2019-01-18 | 上海勋立信息科技有限公司 | 一种多文件的数据分段高速上传方法、客户端及服务器 |
CN111290817B (zh) * | 2020-01-21 | 2024-05-14 | 李岗 | 桌面***的数据装载方法及*** |
CN112115110B (zh) * | 2020-08-14 | 2024-07-23 | 南京航空航天大学 | 一种对文件进行编号的同步备份方法 |
CN113282540A (zh) * | 2021-06-04 | 2021-08-20 | 深圳大学 | 一种云对象存储同步方法、装置、计算机设备及存储介质 |
CN116610634B (zh) * | 2023-07-19 | 2023-09-26 | 南京中孚信息技术有限公司 | 一种网盘终端的文件同步***及方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102360410A (zh) * | 2011-09-30 | 2012-02-22 | 许式伟 | 文件***的用户操作发现方法和应用该方法的同步*** |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7802179B2 (en) * | 2006-12-21 | 2010-09-21 | Microsoft Corporation | Synchronizing data between different editor views |
-
2012
- 2012-05-31 CN CN201210179530.8A patent/CN102790760B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102360410A (zh) * | 2011-09-30 | 2012-02-22 | 许式伟 | 文件***的用户操作发现方法和应用该方法的同步*** |
Non-Patent Citations (2)
Title |
---|
《云存储***中基于更新日志的元数据缓存同步策略》;吴海佳,陈卫卫等;《电信科学》;20111230 * |
《基于定位目录的元数据管理方法》;穆飞,薛巍等;《清华大学学报》;20091230;第49卷(第8期) * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108573014A (zh) * | 2017-12-19 | 2018-09-25 | 北京金山云网络技术有限公司 | 一种文件同步方法、装置、电子设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN102790760A (zh) | 2012-11-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102790760B (zh) | 安全网盘***中一种基于目录树的数据同步方法 | |
CN106250270B (zh) | 一种云计算平台下的数据备份方法 | |
JP5656563B2 (ja) | 文書管理システム、文書管理システムの制御方法、プログラム | |
US9705730B1 (en) | Cloud storage using Merkle trees | |
WO2016138474A1 (en) | Data migration systems and methods including archive migration | |
CN103049709B (zh) | 基于生成元扩展彩虹表的密码恢复***及其恢复方法 | |
CN109040252A (zh) | 文件传输方法、***、计算机设备和存储介质 | |
CN106663056A (zh) | 文件***中的元数据索引搜索 | |
CN106156359A (zh) | 一种云计算平台下的数据同步更新方法 | |
CN102811260B (zh) | 文件云同步***及方法 | |
CN106294870B (zh) | 基于对象的分布式云存储方法 | |
JP2013167990A (ja) | ファイルリスト生成方法及びシステム並びにプログラム、ファイルリスト生成装置 | |
Ho et al. | Distributed graph database for large-scale social computing | |
JP6383110B2 (ja) | データの検索方法、装置及び端末 | |
CN105812427B (zh) | 文件上传和下载方法、装置、及文件服务器 | |
WO2017174013A1 (zh) | 数据存储管理方法、装置及数据存储*** | |
CN108173859A (zh) | 文件共享的方法和*** | |
CN113900810A (zh) | 分布式图处理方法、***及存储介质 | |
CN111400261A (zh) | 一种ipfs快速添加或者删除文件夹的方法 | |
CN104023070B (zh) | 基于云存储的文件压缩方法 | |
CN108090186A (zh) | 一种大数据平台上的电力数据去重方法 | |
CN108243207A (zh) | 一种网络云盘的数据存储方法 | |
Du et al. | Deduplicated disk image evidence acquisition and forensically-sound reconstruction | |
Fanibhare et al. | Smartgrids: Mapreduce framework using hadoop | |
CN110913017A (zh) | 一种基于云桌面的文件压缩传输方法 |
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 |