專利名稱:安全網盤系統(tǒng)中一種基于目錄樹的數(shù)據(jù)同步方法
技術領域:
基于目錄樹的數(shù)據(jù)同步方法屬于多機同步領域,尤其涉及其中文件同步領域。
背景技術:
數(shù)據(jù)同步是指同一份數(shù)據(jù)在不同的存儲設備或終端與服務器、終端與終端之間的備份操作。目前,在網盤系統(tǒng)中使用較多的數(shù)據(jù)同步方法是SyncML協(xié)議和Rsync方法。SyncML是一種平臺無關的信息同步標準協(xié)議,它基于平臺無關的XML語言,可以在若干網絡,平臺及設備間進行一個開放的,全行業(yè)規(guī)范的普遍的 遠程數(shù)據(jù)及個人信息同步。Rsync方法是一種增量上傳的同步方法,通過比對文件塊的哈希值作為判斷依據(jù)執(zhí)行同步操作。但是,隨著云存儲的發(fā)展,越來越多的人開始認可并使用云存儲服務來存放自己的私密數(shù)據(jù),云存儲系統(tǒng)的安全性要求也與日俱增。作為云存儲的重要應用之一,網盤系統(tǒng)隨著安全機制的添加,使用傳統(tǒng)的基于SyncML協(xié)議或Rsync方法的數(shù)據(jù)同步方式在同步的效率和復雜性方面都存在著一定的不足。
發(fā)明內容
本發(fā)明的目的是設計一種新的數(shù)據(jù)同步方法,使得網盤系統(tǒng)中的客戶端與服務器之間在添加了安全機制的情況下能夠正確的、高效的進行數(shù)據(jù)同步。為達到這一目的,本發(fā)明提出了一種基于目錄樹的數(shù)據(jù)同步方法,它的特征在于由客戶端向服務器發(fā)起同步請求,服務器驗證客戶端身份后將它保存在服務器端的服務器端目錄樹(Sever Directory Tree)返回給客戶端,客戶端將服務器端目錄樹、客戶端目錄樹(ClientDirectory Tree)和磁盤目錄樹(Disk Directory Tree)進行比對,再根據(jù)比對的結果生成相應的操作隊列進行操作,完成數(shù)據(jù)同步的過程。本發(fā)明的特征在于,它是在由客戶端計算機、服務器以及云存儲服務器三者共同構成的基于個人用戶共享的安全網絡存儲系統(tǒng)CorsBox中實現(xiàn)的,所述客戶端計算機和服務器之間通過Internet網連接,所述服務器和云存儲服務器之間通過以太網交換機連接,所述安全網盤系統(tǒng)中一種基于同步目錄樹的數(shù)據(jù)同步方法依次含有以下步驟步驟(I ),客戶端計算機初始化所有目錄樹步驟(I. 1),客戶端計算機向服務器發(fā)起同步請求,服務器計算機對客戶端的用戶身份進行驗證,然后將該用戶的服務器端目錄樹返回給客戶端;步驟(I. 2),客戶端計算機讀取保存在本地的客戶端目錄樹生成文件,在內存中創(chuàng)造了該用戶的客戶端目錄樹和組成所述用戶的客戶端目錄樹的客戶端目錄樹結點客戶端目錄樹是一個二叉樹結構,它的格式包括root、nodes、nodesCount和maxnodesCount,其中,nodes,以數(shù)組方式記錄了所述客戶端目錄樹的所有結點;nodesCount,記錄了所述客戶端目錄樹中的總結點數(shù);maxNodesCount,表示所述客戶端目錄樹最多允許包含的結點數(shù);
客戶端目錄樹結點的格式包括nodeType、name、appendAttribute、IastModifyTime、Ichild 和 rchild,其中nodeType,記錄所述客戶端目錄樹中的結點所對應的是目錄還是文件;name,記錄所述客戶端目錄樹中所述目錄或文件的名稱;appendAttribute,對所述客戶端目錄樹中的目錄而言,記錄的是是否被共享,對所述客戶端目錄樹中的文件而言,記錄的是最新版本的版本號;Ichild,記錄了在所述客戶端目錄樹中該結點的左孩子的索引號;rchild,記錄了在所述客戶端目錄樹中該結點的右孩子的索引號;IastModifytime,記錄所述基于個人用戶共享安全網絡存儲系統(tǒng)CorsBox所維護·的該結點的最新修改時間;步驟(I. 3),客戶端計算機根據(jù)步驟(I. I)的返回的服務器端目錄樹在內存中創(chuàng)建該用戶的服務器端目錄樹,用于記錄所述云存儲服務器中的實時數(shù)據(jù)狀態(tài);用戶的服務器端目錄樹的結構與客戶端目錄樹完全相同,只是nodes數(shù)組中的結點類型是用戶服務器端目錄樹結點,用戶服務器端目錄樹結點包括nodeType、name、appendAttribute、lchild和rchild,其中nodeType,記錄所述用戶服務器端目錄樹中的結點所對應的是目錄或文件;name,記錄所述的目錄或文件的名稱;appendAttribute,對所述用戶服務器端目錄樹中的目錄而言,記錄的是是否被共享,對所述用戶服務器端目錄樹中的文件而言,記錄的是最新版本的版本號;Ichild,記錄了在所述用戶服務器端目錄樹中該結點的左孩子的索引號;rchild,記錄了在所述用戶服務器端目錄樹中該結點的右孩子的索引號;步驟(I. 4),所述客戶端計算機在每次同步時掃描磁盤中的所述客戶端目錄樹的目錄及其子目錄,在內存中創(chuàng)造用戶磁盤目錄樹記錄用戶的實時數(shù)據(jù),用戶磁盤目錄樹的結構與客戶端目錄樹完全相同,只是nodes數(shù)組中的結點類型是磁盤目錄樹結點,用戶磁盤目錄樹結點包括nodeType、name、lastModifyTime、Ichild 和 rchild,其中nodeType,記錄所述用戶磁盤目錄樹中的結點所對應的是目錄還是文件;name,記錄所述磁盤目錄樹中所述目錄或文件的名稱;IastModifytime,記錄了在所述客戶端計算機中該結點的最后修改時間;lchild,記錄了在所述磁盤目錄樹中該結點的左孩子的索引號;rchild,記錄了在所述磁盤目錄樹中該結點的右孩子的索引號;步驟(2),客戶端計算機依次按照如下步驟比對客戶端目錄樹與磁盤目錄樹;步驟(2. I),客戶端計算機將客戶端目錄樹排序,排序方法如下步驟(2. I. 1),創(chuàng)建一個當前結點指針指向客戶端目錄樹的根節(jié)點,若當前結點為空,則排序完成,否則使用步驟(2. I. 2)中的方法進行排序;步驟(2. I. 2),對待當前結點的左孩子對應的右結點鏈,某個結點的右節(jié)點鏈定義為一個集合,該集合包含該節(jié)點及其右孩子、右孩子的右孩子……,直到右孩子為空,按照字典序的方式順序排序,對字符串來說,字典序是指若A字符串的首字母在字典中順序排在字符串B的首字母之前,則稱在字典序中A>B,若想相等則比較第二個字母,以此類推;步驟(2. I. 3),將當前結點指針依次指向其左孩子的右結點鏈中的每一個結點,若該結點的類型為目錄,則遞歸執(zhí)行步驟(2. I. 1),若為文件則直接跳過;步驟(2. 2),客戶端計算機將磁盤目錄樹排序,排序方法與步驟(2. I) —樣;步驟(2. 3),客戶端計算機依次按照如下步驟比對客戶端目錄樹與磁盤目錄樹,生成比對結果步驟(2. 3. 1),分別設置客戶端目錄樹的當前結點指針⑶T和磁盤目錄樹的當前結點指針DDT,然后將CDT指向客戶端目錄樹的根節(jié)點,DDT當前指針指向磁盤目錄樹的根節(jié)點;
步驟(2. 3. 2),對客戶端目錄樹與服務器端目錄樹中當前結點指針各自所指向的結點使用(2. 3. 2. I)中的方法進行結點比對;步驟(2. 3. 2. 1),若⑶T當前所指向的結點和DDT當前所指向的結點中,有且僅有一個為空,則在比對結果數(shù)組⑶TvsDDT中增加一個元素記錄該路徑下為空的那顆目錄樹缺失結點,并返回;若CDT當前所指向的結點和DDT當前所指向的結點均為空,則直接返回;若CDT當前所指向的結點和DDT當前所指向的結點均不為空,則按字典序比對兩個當前結點中name域的值若CDT指向的結點中name域的值較大,則將DDT指向其右孩子,轉步驟(2. 3.2);反之則將⑶T指向其右孩子,轉步驟(2. 3.2);若⑶T當前所指向的結點和DDT當前所指向的結點的name域值相同,即依照字典序比較,結果為等于,則比對兩個結點中的IastModifyTime域的值若IastModifyTime域的值不相同,貝U在比對結果數(shù)組(DTvsDDT中增加一個元素記錄當前結點所代表的文件的最后修改時間不同,并轉步驟(2. 3. 3);若IastModifyTime域的值相同,貝U直接轉步驟(2. 3. 3);步驟(2. 3. 3),將⑶T和DDT分別指向各自的左孩子結點,然后再次從步驟(2. 3. 2)開始執(zhí)行;步驟(2. 3. 4),將CDT和DDT分別指向各自的右孩子結點,然后再次從步驟(2. 3. 2)開始執(zhí)行;步驟(2. 3. 5),當執(zhí)行到這一步的時候,客戶端目錄樹與磁盤目錄樹已將整棵樹比對完畢,并將所有缺失的結點與最后修改時間不相同的結點信息都已記錄在比對結果數(shù)組CDTvsDDT 中;步驟(3),客戶端比對客戶端目錄樹與服務器端目錄樹步驟(3. 1),客戶端將服務器端目錄樹排序,排序方法與步驟(2. I)—樣;步驟(3. 2),客戶端計算機依次按照如下步驟比對客戶端目錄樹與服務器端目錄樹,生成比對結果步驟(3. 2. I ),分別設置客戶端目錄樹的當前結點指針⑶T,和服務器目錄樹的當前結點指針SDT,然后將CDT指向客戶端目錄樹的根節(jié)點,SDT指向服務器端目錄樹的根節(jié)占.步驟(3. 2. 2),對客戶端目錄樹與服務器端目錄樹各自的當前結點指針所指向的結點使用步驟(3. 2. 2. I)中的方法進行結點比對;步驟(3. 2. 2. 1),若⑶T當前所指向的結點和SDT當前所指向的結點中,有且僅有一個為空,則在比對結果數(shù)組⑶TvsSDT中增加一個元素記錄該路徑下為空的那顆目錄樹缺失結點,并返回;若CDT當前所指向的結點和SDT當前所指向的結點均為空,則直接返回;若CDT當前所指向的結點和SDT當前所指向的結點均不為空,則按字典序比對兩個當前結點中name域的值若CDT指向的結點中name域的值較大,則將SDT指向其右孩子,轉步驟(3. 2.2);反之則將⑶T指向其右孩子,轉步驟(3. 2.2);若⑶T當前所指向的結點和SDT當前所指向的結點的name域值相同,即依照字典序比較,結果為等于,則比對兩個結點中的appendAttribute域的值;若appendAttribute域的值不相同,貝U在比對結果數(shù)組⑶TvsSDT中增加一個元素記錄當前結點所代表的文件的版本號不同,并轉步驟(3. 2. 3);若appendAttribute域的值相同,貝U直接轉步驟(3. 2. 3);
·
步驟(3. 2. 3),將⑶T和SDT分別指向各自的左孩子結點,然后再次從步驟(3. 2. 2)開始執(zhí)行,步驟(3. 2. 4 ),將CDT和SDT分別指向各自的右孩子結點,然后再次從步驟(3. 2. 2)開始執(zhí)行,步驟(3. 2. 5),當執(zhí)行到這一步的時候,客戶端目錄樹與服務器端目錄樹已將整棵樹比對完畢,并將所有存在結點缺失的路徑或文件版本號不同的結點信息都記錄在比對結果CDTvsSDT數(shù)組當中;步驟(4),客戶端比對步驟(2)和步驟(3)的比對結果,并根據(jù)此結果執(zhí)行相應的同步操作,完成同步過程步驟(4. 1),將步驟(2)中的比對結果⑶TvsDDT數(shù)組中的元素按照路徑的字典序進行排序;步驟(4. 2),將步驟(3)中的比對結果⑶TvsSDT數(shù)組中的元素按照路徑的字典序進行排序;步驟(4. 3),按照如下步驟依次比對數(shù)組CDTvsDDT、CDTvsSDT中的元素,生成需要執(zhí)行的同步操作;步驟(4. 3. I),數(shù)組CDTvsDDT、CDTvsSDT各自的第一個元素作為兩個比對結果傳入的結點,稱為傳入結點,進入步驟(4. 3. 2);步驟(4. 3. 2),比對兩個傳入結點的路徑,將比對結果分為以下幾種情況考慮若步驟(2)中的比對結果傳入的結點記錄的路徑的字典序較小,則根據(jù)該結點記錄的信息分以下情況考慮,并將步驟(2)中傳入結點的下一結點與步驟(3)中的傳入結點作為新的傳入結點再次從步驟(4. 3. 2)開始執(zhí)行;I.若該結點記錄的信息為客戶端目錄樹中存在此結點,而磁盤目錄樹中不存在此結點,則表示該結點對應文件或目錄已被客戶端離線刪除,因此需要對此路徑執(zhí)行下載操作;2.若該結點記錄的信息為磁盤目錄樹中存在此結點,而客戶端目錄樹中不存在此結點,則表示該文件或目錄是用戶在未開啟云存儲服務客戶端的時候增加的,因此需要對此路徑執(zhí)行上傳操作;3.若結點記錄的信息為客戶端目錄樹與磁盤目錄樹中都存在此結點,但它們的最后修改時間不同,則表示用戶在未開啟云存儲服務客戶端的時候修改了此文件,而在這段時間內其他客戶端并沒有提交此文件的新版本至服務器,因此需要對此路徑執(zhí)行上傳操作;若步驟(3)中的比對結果傳入的結點記錄的路徑的字典序較小,則根據(jù)該結點記錄的信息分以下情況考慮,并將步驟(3)中傳入結點的下一結點與步驟(2)中的傳入結點作為新的傳入結點再次從步驟(4. 3. 2)開始執(zhí)行;I.若該結點記錄的信息為客戶端目錄樹中存在此結點,而服務器端目錄樹中不存在此結點,則表示此文件或目錄已被其他客戶端刪除,應在本地將它刪除;2.若該結點記錄的信息為服務器端目錄樹中存在此結點,而客戶端目錄樹中不存在此結點,則表示此文件或目錄是其他客戶端上傳的,應對 此路徑執(zhí)行下載操作;3.若結點記錄的信息為客戶端目錄樹與服務器端目錄樹中都存在此結點,但它們的版本號不同,則說明其他用戶提交了新版本至服務器,而此用戶并沒有對此文件進行修改,因此需要對此路徑執(zhí)行下載操作;若步驟(2)中的路徑與步驟(3)中的路徑一致,則根據(jù)兩個結點分別記錄的信息分以下情況處理,并將兩個傳入結點的下一結點作為新結點再次從步驟(4. 3.2)開始執(zhí)行;I.若步驟(2)中結點記錄的信息為磁盤目錄樹缺失結點,而步驟(3)中結點記錄的信息為服務器端端目錄樹缺失結點,則表示此文件或目錄已被其他用戶刪除,同時該用戶在為開啟云存儲服務客戶端的情況下也刪除了此文件或目錄,因此只需將該路徑對于的結點從客戶端目錄樹中刪除即可;2.若步驟(2)中結點記錄的信息為磁盤目錄樹缺失結點,而步驟(3)中結點記錄的信息為文件版本號不同,則表示其他用戶已上傳此文件的新版本,而此用戶在未開啟云存儲服務客戶端的情況下刪除了此文件,因此需要對此路徑執(zhí)行下載操作;3.若步驟(2)中結點記錄的信息為最后修改時間不同,而步驟(3)中結點記錄的信息為服務器端端目錄樹缺失結點,則表示其他用戶已將此文件刪除,而本地用戶在這段時間卻對此文件進行了修改,因此需要對此路徑執(zhí)行上傳操作;4.若步驟(2)中結點記錄的信息為最后修改時間不同,而步驟(3)中結點記錄的信息為版本號不同,則表示其他用戶上傳了此文件,而本地用戶也修改了此文件,因此需要進行沖突處理,具體的方法是將本地文件重命名后上傳,并從服務器端下載該文件的最新版本;步驟(5),依次執(zhí)行步驟(4)中生成的同步操作,完成同步過程。本發(fā)明在清華大學計算機系高性能計算技術研究所的機基于個人用戶共享的安全網絡存儲系統(tǒng)CorsBox中進行了測試與應用。試驗結果表明,本發(fā)明能夠正確的、高效的實現(xiàn)各個客戶端與服務器之間的數(shù)據(jù)同步。
圖I目錄樹及結點的右結點鏈,其中圖I. 1,目錄結構的樹狀結構邏輯組織方式;圖I. 2,目錄樹的組織方式,其中share、dirl、dir2三個結點構成了 public結點的右結點鏈。圖2同步方法的整體框架。
圖3目錄樹排序的流程。圖4客戶端目錄樹與磁盤目錄樹比對的流程。圖5客戶端目錄樹與服務器端目錄樹比對的流程。圖6對結果再次比對的流程。
具體實施例方式基于個人用戶共享的安全網絡存儲系統(tǒng)CorsBox主要由客戶端軟件,服務器軟件及云存儲服務平臺三部分構成,基于目錄樹的數(shù)據(jù)同步方法運行在所述的CorsBox系統(tǒng)中。CorsBox系統(tǒng)中,服務器和云存儲之間通過以太網交換機連接在一起,客戶端與服務器之間通過Internet連接。存放在客戶端的目錄樹叫做客戶端目錄樹,存放在服務器的·目錄樹叫做服務器端目錄樹,在客戶端需要使用時實時掃描磁盤構建的目錄樹叫做磁盤目錄樹。當客戶端需要同步時,先向服務器端發(fā)送同步請求,服務器端驗證用戶身份后將其服務器端目錄樹返回。服務器端目錄樹存放在服務器端,用于記錄存儲服務器中數(shù)據(jù)狀態(tài)的實時情況。由于存儲服務器只是機械式的存放數(shù)據(jù)的密文而并不記錄數(shù)據(jù)的狀態(tài),服務器端目錄樹必須跟存儲服務器中的實時數(shù)據(jù)狀態(tài)保持一致。使用時,直接通過服務器端目錄樹來代替云端的數(shù)據(jù)狀態(tài)。服務器端目錄樹的結點格式定義如下
Public class SDTNode { private int nodeType;
private String name; private int appendAttribute; private int IChild; private int rChild;
}其中nodeType用來記錄該結點所對應的是目錄還是文件,name用來記錄目錄名或文件名,appendAttribute屬性對目錄來說記錄的是該目錄是否被共享,對文件來說記錄的是該文件最新版本的版本號,IChild記錄了在服務器端目錄樹中該結點的左孩子的索引號,rChild記錄了該結點右孩子的索引號??蛻舳藦姆掌鞯姆祷匦畔⒅袠嫿ǔ龇掌鞫四夸洏?,然后根據(jù)本地文件構建出客戶端目錄樹,最后通過掃描磁盤的方式構建出磁盤目錄樹。目錄樹的格式定義如下Public class DTree I private DTNode root; private DTNode[] nodes; private int nodesCount; private int maxNodesCount;
}其中root表示目錄樹的根節(jié)點,nodes以數(shù)組的方式記錄目錄樹中的所有結點,nodesCount記錄此目錄樹中共有的結點數(shù),maxNodesCount表示此目錄樹最多可以包含的結點數(shù)(即nodes已分配的空間,根據(jù)需要允許擴容)。客戶端目錄樹存放在客戶端,用于記錄用戶的本地數(shù)據(jù)的狀態(tài)與結構。由于用戶有可能在并未開啟系統(tǒng)客戶端的情況下對其本地數(shù)據(jù)進行操作,客戶端目錄樹記錄的其實是最近一次用戶退出系統(tǒng)客戶端時候的數(shù)據(jù)結構狀態(tài)??蛻舳四夸洏浣Y點格式定義如下
·
Public class SDTNode { private int nodeType; private String name;
private int appendAttribute; private int lastModifyTime; private int !Child; private int rChild;
}其中l(wèi)astModifyTime用來記錄該結點的最后修改時間,其余的域與服務器端目錄樹結點的含義一樣。磁盤目錄樹跟前面兩顆目錄樹有些不太相同,它只是用來記錄用戶數(shù)據(jù)的實時情況,以防用戶在未開始客戶端的情況下對數(shù)據(jù)進行了操作導致用戶數(shù)據(jù)與客戶端目錄樹不一致,因此不需要持久化,每次同步開始時掃描磁盤進行構建即可。磁盤目錄樹的格式定義
如下
Public class SDTNode { private int nodeType; private String name; private int lastModifyTime; private int !Child; private int rChild;
}
格式中所有的域的含義與客戶端目錄樹結點的含義一樣,但磁盤目錄樹中記錄的是系統(tǒng)維護的最新的修改時間,而客戶端目錄樹中記錄的是系統(tǒng)(客戶端)維護最后一次維護時的修改時間??蛻舳藰嫿ê萌w目錄樹后按照以下步驟完成同步操作。步驟(I):將三顆目錄樹分別排序,其流程如圖3所示;步驟(2)比對客戶端目錄樹和磁盤目錄樹,并將比對結果保存在⑶TvsDDT數(shù)組中,其流程如圖4所示;步驟(3):比對客戶端目錄樹和服務器端目錄樹,并將 比對結果保存在⑶TvsSDT數(shù)組中,其流程如圖5所示;步驟(4):首先將⑶TvsDDT和⑶TvsSDT數(shù)組按照路徑的字典序進行排序,然后比對⑶TvsDDT和⑶TvsSDT中的所有結點,生成操作隊列(包含本地刪除、上傳、下載和沖突處理四種操作),其流程如圖6所示;步驟(5):依次執(zhí)行操作隊列中的每一項操作,完成整個同步過程。
權利要求
1.安全網盤系統(tǒng)中一種基于目錄樹的同步方法,其特征在于,它是在由客戶端計算機、服務器以及云存儲服務器三者共同構成的基于個人用戶共享的安全網絡存儲系統(tǒng)CorsBox中實現(xiàn)的,所述客戶端計算機和服務器之間通過Internet網連接,所述服務器和云存儲服務器之間通過以太網交換機連接,所述安全網盤系統(tǒng)中一種基于同步目錄樹的數(shù)據(jù)同步方法依次含有以下步驟 步驟(I ),客戶端計算機初始化所有目錄樹 步驟(I. I ),客戶端計算機向服務器發(fā)起同步請求,服務器計算機對客戶端的用戶身份進行驗證,然后將該用戶的服務器端目錄樹返回給客戶端; 步驟(I. 2),客戶端計算機讀取保存在本地的客戶端目錄樹生成文件,在內存中創(chuàng)造了該用戶的客戶端目錄樹和組成所述用戶的客戶端目錄樹的客戶端目錄樹結點 客戶端目錄樹是一個二叉樹結構,它的格式包括root、nodes、nodesCount和maxnodesCount,其中, nodes,以數(shù)組方式記錄了所述客戶端目錄樹的所有結點; nodesCount,記錄了所述客戶端目錄樹中的總結點數(shù); maxNodesCount,表示所述客戶端目錄樹最多允許包含的結點數(shù); 客戶端目錄樹結點的格式包括nodeType、name、appendAttribute、IastModifyTime>Ichild 和 rchild,其中 nodeType,記錄所述客戶端目錄樹中的結點所對應的是目錄還是文件; name,記錄所述客戶端目錄樹中所述目錄或文件的名稱; appendAttribute,對所述客戶端目錄樹中的目錄而言,記錄的是是否被共享,對所述客戶端目錄樹中的文件而言,記錄的是最新版本的版本號; Ichild,記錄了在所述客戶端目錄樹中該結點的左孩子的索引號; rchild,記錄了在所述客戶端目錄樹中該結點的右孩子的索引號; IastModifytime,記錄所述基于個人用戶共享安全網絡存儲系統(tǒng)CorsBox所維護的該結點的最新修改時間; 步驟(I. 3),客戶端計算機根據(jù)步驟(I. I)的返回的服務器端目錄樹在內存中創(chuàng)建該用戶的服務器端目錄樹,用于記錄所述云存儲服務器中的實時數(shù)據(jù)狀態(tài);用戶的服務器端目錄樹的結構與客戶端目錄樹完全相同,只是nodes數(shù)組中的結點類型是用戶服務器端目錄樹結點,用戶服務器端目錄樹結點包括nodeType、name、appendAttribute、Ichild和rchild,其中 nodeType,記錄所述用戶服務器端目錄樹中的結點所對應的是目錄或文件; name,記錄所述的目錄或文件的名稱; appendAttribute,對所述用戶服務器端目錄樹中的目錄而言,記錄的是是否被共享,對所述用戶服務器端目錄樹中的文件而言,記錄的是最新版本的版本號; Ichild,記錄了在所述用戶服務器端目錄樹中該結點的左孩子的索引號; rchild,記錄了在所述用戶服務器端目錄樹中該結點的右孩子的索引號; 步驟(I. 4),所述客戶端計算機在每次同步時掃描磁盤中的所述客戶端目錄樹的目錄及其子目錄,在內存中創(chuàng)造用戶磁盤目錄樹記錄用戶的實時數(shù)據(jù),用戶磁盤目錄樹的結構與客戶端目錄樹完全相同,只是nodes數(shù)組中的結點類型是磁盤目錄樹結點,用戶磁盤目錄樹結點包括:nodeType、name、IastModifyTime、Ichild 和 rchild,其中 nodeType,記錄所述用戶磁盤目錄樹中的結點所對應的是目錄還是文件; name,記錄所述磁盤目錄樹中所述目錄或文件的名稱; IastModifytime,記錄了在所述客戶端計算機中該結點的最后修改時間; Ichild,記錄了在所述磁盤目錄樹中該結點的左孩子的索引號; rchild,記錄了在所述磁盤目錄樹中該結點的右孩子的索引號; 步驟(2),客戶端計算機依次按照如下步驟比對客戶端目錄樹與磁盤目錄樹; 步驟(2. 1),客戶端計算機將客戶端目錄樹排序,排序方法如下 步驟(2. I. 1),創(chuàng)建一個當前結點指針指向客戶端目錄樹的根節(jié)點,若當前結點為空,則排序完成,否則使用步驟(2. I. 2)中的方法進行排序; 步驟(2. I. 2),對待當前結點的左孩子對應的右結點鏈,某個結點的右節(jié)點鏈定義為一個集合,該集合包含該節(jié)點及其右孩子、右孩子的右孩子……,直到右孩子為空,按照字典序的方式順序排序,對字符串來說,字典序是指若A字符串的首字母在字典中順序排在字符串B的首字母之前,則稱在字典序中A>B,若想相等則比較第二個字母,以此類推; 步驟(2. I. 3),將當前結點指針依次指向其左孩子的右結點鏈中的每一個結點,若該結點的類型為目錄,則遞歸執(zhí)行步驟(2. I. 1),若為文件則直接跳過; 步驟(2. 2),客戶端計算機將磁盤目錄樹排序,排序方法與步驟(2. I) 一樣; 步驟(2. 3),客戶端計算機依次按照如下步驟比對客戶端目錄樹與磁盤目錄樹,生成比對結果 步驟(2. 3. 1),分別設置客戶端目錄樹的當前結點指針CDT和磁盤目錄樹的當前結點指針DDT,然后將CDT指向客戶端目錄樹的根節(jié)點,DDT當前指針指向磁盤目錄樹的根節(jié)占. 步驟(2. 3. 2),對客戶端目錄樹與服務器端目錄樹中當前結點指針各自所指向的結點使用(2. 3. 2.1)中的方法進行結點比對; 步驟(2. 3. 2. 1),若CDT當前所指向的結點和DDT當前所指向的結點中,有且僅有一個為空,則在比對結果數(shù)組⑶TvsDDT中增加一個元素記錄該路徑下為空的那顆目錄樹缺失結點,并返回; 若CDT當前所指向的結點和DDT當前所指向的結點均為空,則直接返回; 若CDT當前所指向的結點和DDT當前所指向的結點均不為空,則按字典序比對兩個當前結點中name域的值若CDT指向的結點中name域的值較大,則將DDT指向其右孩子,轉步驟(2. 3.2);反之則將⑶T指向其右孩子,轉步驟(2. 3.2); 若CDT當前所指向的結點和DDT當前所指向的結點的name域值相同,即依照字典序比較,結果為等于,則比對兩個結點中的IastModifyTime域的值 若IastModifyTime域的值不相同,貝U在比對結果數(shù)組⑶TvsDDT中增加一個元素記錄當前結點所代表的文件的最后修改時間不同,并轉步驟(2. 3. 3); 若IastModifyTime域的值相同,貝U直接轉步驟(2. 3. 3); 步驟(2. 3. 3),將⑶T和DDT分別指向各自的左孩子結點,然后再次從步驟(2. 3. 2)開始執(zhí)行; 步驟(2. 3. 4),將CDT和DDT分別指向各自的右孩子結點,然后再次從步驟(2. 3. 2)開始執(zhí)行; 步驟(2. 3. 5),當執(zhí)行到這一步的時候,客戶端目錄樹與磁盤目錄樹已將整棵樹比對完畢,并將所有缺失的結點與最后修改時間不相同的結點信息都已記錄在比對結果數(shù)組CDTvsDDT 中; 步驟(3 ),客戶端比對客戶端目錄樹與服務器端目錄樹 步驟(3. 1),客戶端將服務器端目錄樹排序,排序方法與步驟(2. I) 一樣; 步驟(3. 2),客戶端計算機依次按照如下步驟比對客戶端目錄樹與服務器端目錄樹,生成比對結果 步驟(3. 2. 1),分別設置客戶端目錄樹的當前結點指針CDT,和服務器目錄樹的當前結點指針SDT,然后將CDT指向客戶端目錄樹的根節(jié)點,SDT指向服務器端目錄樹的根節(jié)點;步驟(3. 2. 2),對客戶端目錄樹與服務器端目錄樹各自的當前結點指針所指向的結點使用步驟(3. 2. 2. I)中的方法進行結點比對; 步驟(3. 2. 2. 1),若CDT當前所指向的結點和SDT當前所指向的結點中,有且僅有一個為空,則在比對結果數(shù)組⑶TvsSDT中增加一個元素記錄該路徑下為空的那顆目錄樹缺失結點,并返回; 若CDT當前所指向的結點和SDT當前所指向的結點均為空,則直接返回; 若CDT當前所指向的結點和SDT當前所指向的結點均不為空,則按字典序比對兩個當前結點中name域的值若CDT指向的結點中name域的值較大,則將SDT指向其右孩子,轉步驟(3. 2. 2);反之則將⑶T指向其右孩子,轉步驟(3. 2. 2); 若CDT當前所指向的結點和SDT當前所指向的結點的name域值相同,即依照字典序比較,結果為等于,則比對兩個結點中的appendAttribute域的值; 若appendAttribute域的值不相同,貝U在比對結果數(shù)組⑶TvsSDT中增加一個元素記錄當前結點所代表的文件的版本號不同,并轉步驟(3. 2. 3); 若appendAttribute域的值相同,貝U直接轉步驟(3. 2. 3); 步驟(3. 2. 3),將⑶T和SDT分別指向各自的左孩子結點,然后再次從步驟(3. 2. 2)開始執(zhí)行, 步驟(3. 2. 4),將CDT和SDT分別指向各自的右孩子結點,然后再次從步驟(3. 2. 2)開始執(zhí)行, 步驟(3. 2. 5),當執(zhí)行到這一步的時候,客戶端目錄樹與服務器端目錄樹已將整棵樹比對完畢,并將所有存在結點缺失的路徑或文件版本號不同的結點信息都記錄在比對結果CDTvsSDT數(shù)組當中; 步驟(4),客戶端比對步驟(2)和步驟(3)的比對結果,并根據(jù)此結果執(zhí)行相應的同步操作,完成同步過程 步驟(4. 1),將步驟(2)中的比對結果⑶TvsDDT數(shù)組中的元素按照路徑的字典序進行排序; 步驟(4. 2),將步驟(3)中的比對結果⑶TvsSDT數(shù)組中的元素按照路徑的字典序進行排序; 步驟(4. 3),按照如下步驟依次比對數(shù)組⑶TvsDDT、⑶TvsSDT中的元素,生成需要執(zhí)行的同步操作;步驟(4. 3. 1),數(shù)組⑶TvsDDT、⑶TvsSDT各自的第一個元素作為兩個比對結果傳入的結點,稱為傳入結點,進入步驟(4. 3. 2); 步驟(4. 3. 2),比對兩個傳入結點的路徑,將比對結果分為以下幾種情況考慮 若步驟(2)中的比對結果傳入的結點記錄的路徑的字典序較小,則根據(jù)該結點記錄的信息分以下情況考慮,并將步驟(2)中傳入結點的下一結點與步驟(3)中的傳入結點作為新的傳入結點再次從步驟(4. 3. 2)開始執(zhí)行; .1.若該結點記錄的信息為客戶端目錄樹中存在此結點,而磁盤目錄樹中不存在此結點,則表示該結點對應文件或目錄已被客戶端離線刪除,因此需要對此路徑執(zhí)行下載操作; .2.若該結點記錄的信息為磁盤目錄樹中存在此結點,而客戶端目錄樹中不存在此結點,則表示該文件或目錄是用戶在未開啟云存儲服務客戶端的時候增加的,因此需要對此路徑執(zhí)行上傳操作; .3.若結點記錄的信息為客戶端目錄樹與磁盤目錄樹中都存在此結點,但它們的最后修改時間不同,則表示用戶在未開啟云存儲服務客戶端的時候修改了此文件,而在這段時間內其他客戶端并沒有提交此文件的新版本至服務器,因此需要對此路徑執(zhí)行上傳操作; 若步驟(3)中的比對結果傳入的結點記錄的路徑的字典序較小,則根據(jù)該結點記錄的信息分以下情況考慮,并將步驟(3)中傳入結點的下一結點與步驟(2)中的傳入結點作為新的傳入結點再次從步驟(4. 3. 2)開始執(zhí)行; .1.若該結點記錄的信息為客戶端目錄樹中存在此結點,而服務器端目錄樹中不存在此結點,則表示此文件或目錄已被其他客戶端刪除,應在本地將它刪除; .2.若該結點記錄的信息為服務器端目錄樹中存在此結點,而客戶端目錄樹中不存在此結點,則表示此文件或目錄是其他客戶端上傳的,應對此路徑執(zhí)行下載操作; . 3.若結點記錄的信息為客戶端目錄樹與服務器端目錄樹中都存在此結點,但它們的版本號不同,則說明其他用戶提交了新版本至服務器,而此用戶并沒有對此文件進行修改,因此需要對此路徑執(zhí)行下載操作; 若步驟(2)中的路徑與步驟(3)中的路徑一致,則根據(jù)兩個結點分別記錄的信息分以下情況處理,并將兩個傳入結點的下一結點作為新結點再次從步驟(4. 3. 2)開始執(zhí)行; . 1.若步驟(2)中結點記錄的信息為磁盤目錄樹缺失結點,而步驟(3)中結點記錄的信息為服務器端端目錄樹缺失結點,則表示此文件或目錄已被其他用戶刪除,同時該用戶在為開啟云存儲服務客戶端的情況下也刪除了此文件或目錄,因此只需將該路徑對于的結點從客戶端目錄樹中刪除即可; .2.若步驟(2)中結點記錄的信息為磁盤目錄樹缺失結點,而步驟(3)中結點記錄的信息為文件版本號不同,則表示其他用戶已上傳此文件的新版本,而此用戶在未開啟云存儲服務客戶端的情況下刪除了此文件,因此需要對此路徑執(zhí)行下載操作; .3.若步驟(2)中結點記錄的信息為最后修改時間不同,而步驟(3)中結點記錄的信息為服務器端端目錄樹缺失結點,則表示其他用戶已將此文件刪除,而本地用戶在這段時間卻對此文件進行了修改,因此需要對此路徑執(zhí)行上傳操作; . 4.若步驟(2)中結點記錄的信息為最后修改時間不同,而步驟(3)中結點記錄的信息為版本號不同,則表示其他用戶上傳了此文件,而本地用戶也修改了此文件,因此需要進行沖突處理,具體的方法是將本地文件重命名后上傳,并從服務器端下載該文件的最新版本; 步驟(5 ),依次執(zhí)行步驟(4 )中生成的同步操作,完成同步過程。
全文摘要
安全網盤系統(tǒng)中基于目錄樹的數(shù)據(jù)同步方法屬于多機同步領域,尤其涉及其中文件同步領域。本發(fā)明的特征在于客戶端只需要保存一顆客戶端目錄樹就可以完成同步,提高了存儲效率;服務器端通過目錄樹就可以知道云端數(shù)據(jù)的實時情況,減少了系統(tǒng)開銷;產生同步操作的過程中僅進行了兩次目錄樹比對和一次結果比對,提高了數(shù)據(jù)同步的效率;整個數(shù)據(jù)同步的過程與數(shù)據(jù)本身的內容無關,保證了同步過程中數(shù)據(jù)的安全性,因此可以適用于任何具有安全機制的網盤系統(tǒng)中。
文檔編號H04L29/06GK102790760SQ201210179530
公開日2012年11月21日 申請日期2012年5月31日 優(yōu)先權日2012年5月31日
發(fā)明者傅穎勛, 舒繼武 申請人:清華大學