基于文件分塊的文件修改方法、單文件同步方法及裝置制造方法
【專利摘要】本發(fā)明公開了一種基于文件分塊的文件修改方法、同步方法及裝置,文件修改裝置包括:劃分模塊用于采用定長(zhǎng)的分塊方法將文件劃分為多個(gè)數(shù)據(jù)塊,并在文件頭中記錄所有數(shù)據(jù)塊的分塊信息;修改模塊用于在文件中增加字節(jié)或者刪除字節(jié)后,更新文件頭中的分塊信息;單文件同步裝置包括:接收模塊用于接收文件分塊裝置對(duì)文件B修改后生成的文件頭SB;差異信息生成模塊用于將本地文件A的文件頭SA和SB比對(duì),生成SA和SB的差異信息;同步模塊用于將所述差異信息發(fā)送至文件分塊裝置,并根據(jù)文件分塊裝置返回的重構(gòu)本地文件A所需的數(shù)據(jù)信息更新本地文件A。本發(fā)明能夠減少文件修改對(duì)文件分塊的影響,從而在同步文件時(shí),減少傳輸?shù)臄?shù)據(jù)量。
【專利說(shuō)明】基于文件分塊的文件修改方法、單文件同步方法及裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及數(shù)據(jù)同步技術(shù),具體涉及一種基于文件分塊的文件修改方法及裝置、 單文件同步方法及裝置。
【背景技術(shù)】
[0002] 云存儲(chǔ)的理念在于允許用戶隨時(shí)隨地地訪問(wèn)存儲(chǔ)在云端的文件,并且允許用戶對(duì) 文件進(jìn)行修改和刪除等操作。因此,需要及時(shí)地同步用戶端和服務(wù)器的文件,保證文件的一 致性。
[0003] 目前的單文件同步方法主要是rsync算法。假設(shè)服務(wù)器上的文件為A,客戶端的文 件為B。文件A和文件B非常相似。這兩個(gè)文件同步的步驟為:
[0004] 1)用戶端將文件B分割成連續(xù)不重疊的固定大小數(shù)據(jù)塊K,最后一個(gè)塊的大小可 能會(huì)<k ;
[0005] 2)用戶端為每一個(gè)塊計(jì)算校驗(yàn)值,生成一個(gè)32位的弱滾動(dòng)校驗(yàn)和一個(gè)128位的 MD4校驗(yàn);
[0006] 3)用戶端將校驗(yàn)值發(fā)送給服務(wù)器;
[0007] 4)服務(wù)器通過(guò)以相同的方式,對(duì)文件A切塊,并計(jì)算校驗(yàn)值;
[0008] 5)服務(wù)器比對(duì)文件A和用戶端發(fā)來(lái)的文件B的校驗(yàn)信息,并生成差異編碼信息; [0009] 6)服務(wù)器給用戶端發(fā)送差異編碼信息,同時(shí)發(fā)送重構(gòu)文件A的指令;
[0010] 7)用戶端將根據(jù)差異編碼信息和文件B重構(gòu)文件A。
[0011] Rsync是應(yīng)用較廣的文件同步方法,但是由于它采用的是定長(zhǎng)的文件切割方法,因 此,在文件中1個(gè)字節(jié)的變化會(huì)帶來(lái)大量切片的變化,存在同步數(shù)據(jù)量過(guò)大的問(wèn)題。
【發(fā)明內(nèi)容】
[0012] 本發(fā)明需要解決的技術(shù)問(wèn)題是提供一種基于文件分塊的文件修改方法及裝置、單 文件同步方法及裝置,以減少文件修改對(duì)文件分塊的影響,從而在同步文件時(shí),減少傳輸?shù)?數(shù)據(jù)量。
[0013] 為了解決上述技術(shù)問(wèn)題,本發(fā)明提供了一種基于文件分塊的文件修改方法,包 括:
[0014] 以K為數(shù)據(jù)塊的固定長(zhǎng)度,采用定長(zhǎng)的分塊方法將所述文件劃分為多個(gè)數(shù)據(jù)塊, 并在文件頭中記錄所有數(shù)據(jù)塊的分塊信息,所述分塊信息包括:數(shù)據(jù)塊的總塊數(shù)以及每個(gè) 數(shù)據(jù)塊的偏移值、長(zhǎng)度、校驗(yàn)值、索引編號(hào)以及實(shí)際存儲(chǔ)的位置鏈接;
[0015] 當(dāng)在文件中增加字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小 于等于K,則合成新的第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng) 度大于K甚至nK,則從增加字節(jié)處,連續(xù)截取長(zhǎng)為K的數(shù)據(jù)塊,直至最后一個(gè)數(shù)據(jù)塊的長(zhǎng)度 小于K,i、k、η、Κ均為大于0的正整數(shù),至此文件分塊結(jié)束;
[0016] 當(dāng)在文件中刪除字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù) 塊,則將刪除k字節(jié)后的數(shù)據(jù)塊作為第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì) 刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù)塊,j>i>〇,則將刪除字節(jié)起始位置之前的數(shù)據(jù)塊 作為第i個(gè)數(shù)據(jù)塊,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊作為第i+ι個(gè)數(shù) 據(jù)塊,至此文件分塊結(jié)束;
[0017] 當(dāng)在文件中增加字節(jié)或者刪除字節(jié)時(shí),在文件分塊結(jié)束后,更新文件頭中的分塊 信息。
[0018] 進(jìn)一步地,所述當(dāng)在文件中增加字節(jié)時(shí),在文件分塊結(jié)束后,更新文件頭中的分塊 信息,包括:
[0019] 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于等于K,合成新的第i 個(gè)數(shù)據(jù)塊后,重新計(jì)算該數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值 +k,并記錄在文件頭中;
[0020] 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則在文件分 塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為Κ,計(jì)算新增數(shù)據(jù)塊的校 驗(yàn)值、偏移值、長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值+k,并修改各個(gè)數(shù)據(jù)塊的索引 編號(hào),記錄在文件頭中。
[0021] 進(jìn)一步地,所述當(dāng)在文件中刪除字節(jié)時(shí),所述在文件分塊結(jié)束后,更新頭文件中的 分塊信息,包括:
[0022] 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,則重新計(jì)算該數(shù)據(jù)塊 的校驗(yàn)值和長(zhǎng)度,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值_k,并記錄在文件頭中;
[0023] 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù) 塊,j>i>〇,則在文件分塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為刪 除字節(jié)起始位置之前的數(shù)據(jù)塊長(zhǎng)度,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊 作為第i + Ι個(gè)數(shù)據(jù)塊,更新所述第i + Ι個(gè)數(shù)據(jù)塊的偏移值為刪除字節(jié)的起始位置、更新其數(shù) 據(jù)塊長(zhǎng)度為自刪除字節(jié)的起始位置起至第j個(gè)數(shù)據(jù)塊結(jié)束的長(zhǎng)度_k,并計(jì)算所述第i + Ι個(gè) 數(shù)據(jù)塊的校驗(yàn)值,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值_k,并修改后續(xù)數(shù)據(jù)塊的索引編號(hào), 記錄在文件頭中。
[0024] 為了解決上述技術(shù)問(wèn)題,本發(fā)明還提供了一種基于如上所述的文件修改方法的單 文件同步方法,包括:
[0025] 第一裝置接收到第二裝置對(duì)文件B增加 k字節(jié)或刪除k字節(jié)后生成的文件頭SB ;
[0026] 第一裝置將本地文件A的文件頭SA和SB進(jìn)行比對(duì),生成S A和SB的差異信息;
[0027] 第一裝置將所述差異信息發(fā)送至第二裝置;
[0028] 第二裝置根據(jù)所述差異信息和修改后的文件B,向第一裝置返回重構(gòu)所述本地文 件A所需的數(shù)據(jù)信息,第一裝置根據(jù)所述數(shù)據(jù)信息更新所述本地文件A ;
[0029] 其中,所述第一裝置為服務(wù)器,所述第二裝置為客戶端;或者,所述第一裝置為客 戶端,所述第二裝置為服務(wù)器。
[0030] 進(jìn)一步地,對(duì)于增加字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第 i個(gè)數(shù)據(jù)塊和新增數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù);
[0031] 對(duì)于刪除字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè)數(shù)據(jù)塊 和第i+Ι個(gè)數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù)。
[0032] 進(jìn)一步地,對(duì)于增加字節(jié),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度 小于等于K,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后 續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該 數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值 和長(zhǎng)度,所述新增數(shù)據(jù)塊的分塊信息包括:新增數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào), 所述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào);
[0033] 對(duì)于刪除字節(jié),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,所述 第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù)數(shù)據(jù)塊的分塊信息 包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至 刪除至第j個(gè)數(shù)據(jù)塊,所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度, 所述第i+Ι個(gè)數(shù)據(jù)塊的分塊信息包括:第i+Ι個(gè)數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào), 所述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào)。
[0034] 進(jìn)一步地,所述第一裝置將本地文件A的頭文件SA和SB進(jìn)行比對(duì),生成S A和SB的 差異信息,包括:
[0035] 根據(jù)SA和SB計(jì)算文件B總數(shù)據(jù)塊減去文件A總數(shù)據(jù)塊的差值N ;
[0036] 從兩個(gè)文件的第一個(gè)數(shù)據(jù)塊開始比對(duì),直到找到第一個(gè)校驗(yàn)值不同的兩個(gè)數(shù)據(jù) 塊;
[0037] 如果N = 0,則記錄文件B的該數(shù)據(jù)塊的分塊信息以及后續(xù)數(shù)據(jù)塊的分塊信息;
[0038] 如果N為正整數(shù),則記錄文件B的該數(shù)據(jù)塊、后續(xù)N個(gè)數(shù)據(jù)塊以及第N個(gè)數(shù)據(jù)塊之 后的數(shù)據(jù)塊的分塊信息;
[0039] 如果N為負(fù)整數(shù),則記錄文件B的該數(shù)據(jù)塊、其后第(-N+1)個(gè)數(shù)據(jù)塊及其后續(xù)的 數(shù)據(jù)塊的分塊信息。
[0040] 進(jìn)一步地,當(dāng)?shù)谝谎b置與第二裝置完成同步后,第一裝置根據(jù)本地文件A的文件 頭SA中記錄的所有數(shù)據(jù)塊的長(zhǎng)度以及數(shù)據(jù)塊總數(shù),計(jì)算一個(gè)數(shù)據(jù)塊的長(zhǎng)度平均值,如果所 述數(shù)據(jù)塊的長(zhǎng)度平均值小于預(yù)設(shè)閾值,則所述第一裝置對(duì)所述本地文件A以K為一個(gè)數(shù)據(jù) 塊的長(zhǎng)度重新分塊,并通知第二裝置以相同的方式對(duì)文件B重新分塊,并計(jì)算校驗(yàn)值,生成 新的s A和SB。
[0041] 為了解決上述技術(shù)問(wèn)題,本發(fā)明還提供了一種基于文件分塊的文件修改裝置,包 括:
[0042] 劃分模塊,用于以K為數(shù)據(jù)塊的固定長(zhǎng)度,采用定長(zhǎng)的分塊方法將所述文件劃分 為多個(gè)數(shù)據(jù)塊,并在文件頭中記錄所有數(shù)據(jù)塊的分塊信息,所述分塊信息包括:數(shù)據(jù)塊的總 塊數(shù)以及每個(gè)數(shù)據(jù)塊的偏移值、長(zhǎng)度、校驗(yàn)值、索引編號(hào)以及實(shí)際存儲(chǔ)的位置鏈接;
[0043] 修改模塊,用于當(dāng)在文件中增加字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該 數(shù)據(jù)塊的長(zhǎng)度小于等于K,則合成新的第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后, 該數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則從增加字節(jié)處,連續(xù)截取長(zhǎng)為K的數(shù)據(jù)塊,直至最后一個(gè) 數(shù)據(jù)塊的長(zhǎng)度小于K,i、k、η、Κ均為大于等于1的整數(shù),至此文件分塊結(jié)束;
[0044] 當(dāng)在文件中刪除字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù) 塊,則將刪除k字節(jié)后的數(shù)據(jù)塊作為第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì) 刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù)塊,j>i>〇,則將刪除字節(jié)起始位置之前的數(shù)據(jù)塊 作為第i個(gè)數(shù)據(jù)塊,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊作為第i+ι個(gè)數(shù) 據(jù)塊,至此文件分塊結(jié)束;
[0045] 當(dāng)在文件中增加字節(jié)或者刪除字節(jié)時(shí),在文件分塊結(jié)束后,更新頭文件中的分塊 信息;
[0046] 發(fā)送模塊,用于將更新的頭文件發(fā)送至單文件同步裝置。
[0047] 進(jìn)一步地,所述修改模塊,用于當(dāng)在文件中增加字節(jié)時(shí),在文件分塊結(jié)束后,更新 頭文件中的分塊信息,包括:
[0048] 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于等于K,合成新的第i 個(gè)數(shù)據(jù)塊后,重新計(jì)算該數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值 +k,并記錄在文件頭中;
[0049] 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則在文件分 塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為Κ,計(jì)算新增數(shù)據(jù)塊的校 驗(yàn)值、偏移值、長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值+k,并修改各個(gè)數(shù)據(jù)塊的索引 編號(hào),記錄在頭文件中;
[0050] 所述修改模塊,用于當(dāng)在文件中刪除字節(jié)時(shí),所述在文件分塊結(jié)束后,更新頭文件 中的分塊信息,包括:
[0051] 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,則重新計(jì)算該數(shù)據(jù)塊 的校驗(yàn)值和長(zhǎng)度,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值_k,并記錄在頭文件中;
[0052] 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù) 塊,j>i>〇,則在文件分塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為刪 除字節(jié)起始位置之前的數(shù)據(jù)塊長(zhǎng)度,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊 作為第i+Ι個(gè)數(shù)據(jù)塊,更新所述第i+Ι個(gè)數(shù)據(jù)塊的偏移值為刪除字節(jié)的起始位置、更新其數(shù) 據(jù)塊長(zhǎng)度為自刪除字節(jié)的起始位置起至第j個(gè)數(shù)據(jù)塊結(jié)束的長(zhǎng)度_k,并計(jì)算所述第i+Ι個(gè) 數(shù)據(jù)塊的校驗(yàn)值,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值_k,并修改后續(xù)數(shù)據(jù)塊的索引編號(hào), 記錄在頭文件中。
[0053] 為了解決上述技術(shù)問(wèn)題,本發(fā)明還提供了一種基于如上所述的文件修改裝置的單 文件同步裝置,包括:
[0054] 接收模塊,用于接收文件分塊裝置對(duì)文件B增加 k字節(jié)或刪除k字節(jié)后生成的文 件頭SB,還用于接收所述文件分塊裝置返回重構(gòu)所述本地文件A所需的數(shù)據(jù)信息;
[0055] 差異信息生成模塊,用于將本地文件A的頭文件SA和SB進(jìn)行比對(duì),生成S A和SB的 差異?目息;
[0056] 同步模塊,用于將所述差異信息發(fā)送至所述文件分塊裝置,并根據(jù)所述文件分塊 裝置返回的重構(gòu)所述本地文件Α所需的數(shù)據(jù)信息更新所述本地文件Α。
[0057] 進(jìn)一步地,對(duì)于增加字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第 i個(gè)數(shù)據(jù)塊和新增數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù);
[0058] 對(duì)于刪除字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè)數(shù)據(jù)塊 和第i+Ι個(gè)數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù)。
[0059] 進(jìn)一步地,對(duì)于增加字節(jié),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度 小于等于K,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后 續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該 數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值 和長(zhǎng)度,所述新增數(shù)據(jù)塊的分塊信息包括:新增數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào), 所述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào);
[0060] 對(duì)于刪除字節(jié),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,所述 第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù)數(shù)據(jù)塊的分塊信息 包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至 刪除至第j個(gè)數(shù)據(jù)塊,所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度, 所述第i+Ι個(gè)數(shù)據(jù)塊的分塊信息包括:第i+Ι個(gè)數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào), 所述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào)。
[0061] 進(jìn)一步地,所述差異信息生成模塊,用于將本地文件A的頭文件SA和SB進(jìn)行比對(duì), 生成S A和SB的差異信息,包括:
[0062] 根據(jù)SA和SB計(jì)算文件B總數(shù)據(jù)塊減去文件A總數(shù)據(jù)塊的差值N ;
[0063] 從兩個(gè)文件的第一個(gè)數(shù)據(jù)塊開始比對(duì),直到找到第一個(gè)校驗(yàn)值不同的兩個(gè)數(shù)據(jù) 塊;
[0064] 如果N = 0,則記錄文件B的該數(shù)據(jù)塊的分塊信息以及后續(xù)數(shù)據(jù)塊的分塊信息; [0065] 如果N為正整數(shù),則記錄文件B的該數(shù)據(jù)塊、后續(xù)N個(gè)數(shù)據(jù)塊以及第N個(gè)數(shù)據(jù)塊之 后的數(shù)據(jù)塊的分塊信息;
[0066] 如果N為負(fù)整數(shù),則記錄文件B的該數(shù)據(jù)塊、其后第(-N+1)個(gè)數(shù)據(jù)塊及其后續(xù)的 數(shù)據(jù)塊的分塊信息。
[0067] 為了解決上述技術(shù)問(wèn)題,本發(fā)明還提供了一種單文件同步系統(tǒng),包括:如上所述的 文件修改裝置和如上所述的單文件同步裝置;
[0068] 其中,所述文件修改裝置為服務(wù)器,所述單文件同步裝置為客戶端;或者,所述文 件修改裝置為客戶端,所述單文件同步裝置為服務(wù)器。
[0069] 與現(xiàn)有技術(shù)相比,本發(fā)明實(shí)施例提供的文件分塊方法及裝置、文件同步方法及裝 置,具有以下有益效果:
[0070] 1)對(duì)文件的修改只影響增加或刪除字節(jié)位置附近的數(shù)據(jù)塊信息,因此,對(duì)文件切 片影響較小,在同步文件時(shí),只需要更新增加或刪除字節(jié)位置附近的數(shù)據(jù)塊的信息,傳輸?shù)?文件內(nèi)容也相應(yīng)減少;2)文件分塊大小不會(huì)無(wú)限制大,系統(tǒng)設(shè)計(jì)人員可根據(jù)系統(tǒng)的承受能 力設(shè)計(jì)K值,以平衡管理復(fù)雜性和文件傳輸代價(jià);3)杜絕了大量文件碎片。
【專利附圖】
【附圖說(shuō)明】
[0071] 圖1是現(xiàn)有技術(shù)中文件A和文件B的組成示意圖;
[0072] 圖2是實(shí)施例中文件分塊方法的流程圖;
[0073] 圖3是實(shí)施例中基于上述文件分塊方法的單文件同步方法的流程圖;
[0074] 圖4是實(shí)施例中一種單文件同步系統(tǒng)的結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0075] 為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,下文中將結(jié)合附圖對(duì)本發(fā)明 的實(shí)施例進(jìn)行詳細(xì)說(shuō)明。需要說(shuō)明的是,在不沖突的情況下,本申請(qǐng)中的實(shí)施例及實(shí)施例中 的特征可以相互任意組合。
[0076] 實(shí)施例:
[0077] 本實(shí)施例中包括兩個(gè)裝置,其中,第一裝置為服務(wù)器,第二裝置為客戶端;或者,第 一裝置為客戶端,第二裝置為服務(wù)器,本實(shí)施例的前提是第一裝置和第二裝置上同時(shí)存在 一個(gè)文件,同步算法的目標(biāo)在于保持兩個(gè)裝置的文件的一致,同時(shí)要求第二裝置和第一裝 置的數(shù)據(jù)塊傳輸量最小。約定第一裝置上的文件為A,第二裝置的文件為B。系統(tǒng)為文件A 維護(hù)文件分塊信息為SA,文件B的分塊信息為SB。文件A和文件B的組成如圖1所示,文件 頭head,也即5 4和SB,包含了數(shù)據(jù)塊的總塊數(shù)以及所有數(shù)據(jù)塊的分塊信息,即對(duì)于每一個(gè)數(shù) 據(jù)塊,需記錄數(shù)據(jù)塊的初始字節(jié)的偏移值(offset)、數(shù)據(jù)塊長(zhǎng)度、數(shù)據(jù)塊的校驗(yàn)值、索引編 號(hào)以及實(shí)際存儲(chǔ)的位置鏈接(系統(tǒng)借助于該鏈接可獲取數(shù)據(jù)塊的詳細(xì)內(nèi)容),dbi表示第i 個(gè)數(shù)據(jù)塊。初始狀態(tài)下,SA和SB是一致的,如果在第一裝置或第二裝置對(duì)文件進(jìn)行了更改, 就涉及到3 4和SB的同步問(wèn)題,S卩如果在客戶端對(duì)文件進(jìn)行了修改,則服務(wù)器端需進(jìn)行同步, 如果在服務(wù)器端對(duì)文件進(jìn)行了修改,則客戶端需進(jìn)行同步。
[0078] 在文件增量同步算法的設(shè)計(jì)中,需要盡可能減少重復(fù)數(shù)據(jù)傳輸,即盡量不傳輸文 件A和文件B的相同部分。但是在Rsync算法中,定長(zhǎng)的文件切塊方法使得文件中一個(gè)字 節(jié)的增減都會(huì)帶來(lái)大量數(shù)據(jù)塊的改變。為此,本實(shí)施例提供了一種文件分塊方法,如圖2所 示,以對(duì)第二裝置的文件進(jìn)行修改為例,包括以下步驟:
[0079] S101 :以K為數(shù)據(jù)塊的固定長(zhǎng)度,采用定長(zhǎng)的分塊方法將所述文件劃分為多個(gè)數(shù) 據(jù)塊,并在文件頭中記錄所有數(shù)據(jù)塊的分塊信息,所述分塊信息包括:數(shù)據(jù)塊的總塊數(shù)以及 每個(gè)數(shù)據(jù)塊的偏移值、長(zhǎng)度、校驗(yàn)值、索引編號(hào)以及實(shí)際存儲(chǔ)的位置鏈接;
[0080] S102 :第二裝置對(duì)文件進(jìn)行修改;
[0081] 對(duì)文件的修改包括了替換、增加和刪除。替換可理解為用等量字節(jié)的內(nèi)容去替換 原有的內(nèi)容,因此,對(duì)文件的切塊方式不產(chǎn)生影響。所以,本發(fā)明只考慮對(duì)文件增加和刪除 字節(jié)的情況。
[0082] 當(dāng)在文件中刪除字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù) 塊,則將刪除k字節(jié)后的數(shù)據(jù)塊作為第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì) 刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù)塊,j>i>〇,則將刪除字節(jié)起始位置之前的數(shù)據(jù)塊 作為第i個(gè)數(shù)據(jù)塊,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊作為第i+ι個(gè)數(shù) 據(jù)塊,至此文件分塊結(jié)束;
[0083] 當(dāng)在文件中增加字節(jié)或者刪除字節(jié)時(shí),在文件分塊結(jié)束后,更新文件頭中的分塊 信息。
[0084] 其中,當(dāng)在文件中增加字節(jié)時(shí),在文件分塊結(jié)束后,更新文件頭中的分塊信息,包 括:
[0085] 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于等于K,合成新的第i 個(gè)數(shù)據(jù)塊后,重新計(jì)算該數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值 +k,并記錄在文件頭中;
[0086] 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則在文件分 塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為Κ,計(jì)算新增數(shù)據(jù)塊的校 驗(yàn)值、偏移值、長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值+k,并修改各個(gè)數(shù)據(jù)塊的索引 編號(hào),記錄在文件頭中。
[0087] 在一個(gè)應(yīng)用示例中,假設(shè)增加的字節(jié)的首位為距離文件頭部offset處,長(zhǎng)度為k, 且offset^ = offset〈 = offseti+lengthj即,在第i個(gè)數(shù)據(jù)塊中增加字節(jié)),則存在以下 情況:
[0088] a)若lengthi+K = K,則意味著dbi在擴(kuò)展了 k個(gè)字節(jié)后,仍然未達(dá)到數(shù)據(jù)塊的最 大長(zhǎng)度。因此,新增加的k個(gè)字節(jié)與原有的第i個(gè)數(shù)據(jù)塊dbi組合成新的數(shù)據(jù)塊,并通報(bào)給 head,由head重新計(jì)算dbi的校驗(yàn)值以及后續(xù)數(shù)據(jù)塊的offset值,即原數(shù)據(jù)塊的偏移值+k。
[0089] b)若lengthi+kMi,則意味著dbi在擴(kuò)展了 k個(gè)字節(jié)后,已經(jīng)達(dá)到了數(shù)據(jù)塊的最大 長(zhǎng)度,則繼續(xù)判斷:dbi+1
[0090] i) lengthi+lengthw+K = 2K,則意味著可將dbi和dbi+1以及新增加的k個(gè)字節(jié), 組合成2個(gè)數(shù)據(jù)塊,因此,優(yōu)先從off seh至off setjk的文件塊中,截取長(zhǎng)為K的文件塊, 并記為dbi,從offseti+K至offseti+k的文件內(nèi)容記為db i+1 ;同時(shí),通知文件頭head更改 相應(yīng)的數(shù)據(jù)塊的分塊信息,參見(jiàn)a);
[0091] ii) lengthi+lengthi^+kWK,意味著dbi、dbi+1以及新增加的k個(gè)字節(jié)將超過(guò)2個(gè) 數(shù)據(jù)塊的長(zhǎng)度。因此,優(yōu)先從off seh至off setjk的文件塊中,截取長(zhǎng)為K的文件塊,并標(biāo) 識(shí)為dbi ;然后,從off setjK至off setjk的文件塊中,截取長(zhǎng)為K的文件塊,標(biāo)識(shí)為dbi+1, 從offseti+ZK至offsetjk的文件塊中,繼續(xù)以K為單位,對(duì)文件塊進(jìn)行切片,直至最后一 個(gè)塊的長(zhǎng)度小于K,記為dbp文件分塊結(jié)束后,更新head中的分片信息,即計(jì)算所述第i個(gè) 數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊大小為K,計(jì)算新增數(shù)據(jù)塊的校驗(yàn)值、數(shù)據(jù)塊偏移值、數(shù)據(jù)塊 大小,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值+k,并修改各個(gè)數(shù)據(jù)塊的索引編號(hào),記錄在文 件頭中。
[0092] 上述還有一種情況沒(méi)有討論到,即dbi為文件的最后一個(gè)數(shù)據(jù)塊,也即用戶對(duì)文件 的操作為在文件末尾增加 k字節(jié)的內(nèi)容,這類情況可參考ii)。
[0093] 其中,當(dāng)在文件中刪除字節(jié)時(shí),所述在文件分塊結(jié)束后,更新文件頭中的分塊信 息,包括:
[0094] 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,則重新計(jì)算該數(shù)據(jù)塊 的校驗(yàn)值和長(zhǎng)度,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值_k,并記錄在文件頭中;
[0095] 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù) 塊,j>i>〇,則在文件分塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為刪 除字節(jié)起始位置之前的數(shù)據(jù)塊長(zhǎng)度,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊 作為第i+Ι個(gè)數(shù)據(jù)塊,更新所述第i+Ι個(gè)數(shù)據(jù)塊的偏移值為刪除字節(jié)的起始位置、更新其數(shù) 據(jù)塊長(zhǎng)度為自刪除字節(jié)的起始位置起至第j個(gè)數(shù)據(jù)塊結(jié)束的長(zhǎng)度-k,并計(jì)算所述第i+Ι個(gè) 數(shù)據(jù)塊的校驗(yàn)值,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值-k,并修改后續(xù)數(shù)據(jù)塊的索引編號(hào), 記錄在文件頭中。
[0096] 在一個(gè)應(yīng)用示例中,假設(shè)刪除的字節(jié)的首位為距離文件頭部offset處,長(zhǎng)度為k, 且offset^ = offset〈 = offseti+lengthi (即,在第i個(gè)數(shù)據(jù)塊中刪除字節(jié))。刪除字節(jié) 時(shí)的處理原則是:盡量減少對(duì)數(shù)據(jù)塊切分方式的改變。因此,刪除字節(jié)的處理步驟如下:
[0097] a)若k〈 = lengthi-Orffset-offseti)則意味著用戶對(duì)文件的修改僅改變了第i 個(gè)數(shù)據(jù)塊dbi,對(duì)文件的其他分塊不產(chǎn)生影響。因此,僅需要head更新第i個(gè)數(shù)據(jù)塊的校驗(yàn) 信息及后續(xù)數(shù)據(jù)塊的偏移值,即〇ffseti+1_k ;
[0098] b)如果 lengthy (offset - offset^〈 = k〈 = lengthy (offset -ofTsetJ+lengthiq,改變了第i和i+1這兩個(gè)數(shù)據(jù)塊dbi、dbi+1,為了不影響分塊,dbi的數(shù) 據(jù)塊的起始位置還是offset^長(zhǎng)度變?yōu)閛ffset - offset^ ;dbi+1的起始位置變?yōu)閛ffset,長(zhǎng) 度變?yōu)閘engthi+lengthi+foffset - offset^ -k,隨后數(shù)據(jù)塊的偏移值都減去k ;
[0099] 此時(shí),塊數(shù)還是沒(méi)有變,即沒(méi)有刪去數(shù)據(jù)塊,也就是說(shuō),索引的個(gè)數(shù)沒(méi)有變,因此, head僅需要更新dbi的校驗(yàn)信息、數(shù)據(jù)塊大小,dbi+1的校驗(yàn)信息、偏移值和數(shù)據(jù)塊大小,以 及后續(xù)數(shù)據(jù)塊的偏移值。
[0100] c)否則意味著需要?jiǎng)h除多個(gè)數(shù)據(jù)塊。因此,自offset開始,刪除至第j個(gè)數(shù)據(jù)塊, 其中j滿足以下條件:
[0101] lengthy (offset -offsetj) + (lengthi+1+lengthi+2+··· +lengthJ_1) < = k〈= lengthy (offset - offsetj) + (lengthi+1+lengthi+2+···+lengthj) ;j> = i+2 ;
[0102] 對(duì)于第j個(gè)數(shù)據(jù)塊,刪除自offset」至讓-[16叩1:11廠((^861:-offsetj) + (lengthi+1+lengthi+2+··· +lengthJ_1)的字節(jié)。
[0103] 同時(shí),通知head刪除數(shù)據(jù)塊i+1至j的相關(guān)信息,更新dbi和dbj的校驗(yàn)信息,并 修改隨后的數(shù)據(jù)塊的offset信息為:原數(shù)據(jù)塊偏移值-k。
[0104] I:匕如,j = i+2 ;滿足:
[0105] lengthj-(offset - offsetj)+lengthi+1< = k< = lengthj- (offset -offsetj) +lengthi+1+lengthi+2,
[0106] 對(duì)于第i個(gè)數(shù)據(jù)塊(同上),dbi的數(shù)據(jù)塊的起始位置還是offset,長(zhǎng)度變?yōu)?offset - offsetj ;
[0107] 對(duì)于第j個(gè)數(shù)據(jù)塊,起始位置為offset,長(zhǎng)度變?yōu)閘engthy (offset -offsetj)+lengthi+1+lengthi+2-k ;
[0108] 此時(shí)的數(shù)據(jù)塊會(huì)少1個(gè),也就是說(shuō)索引會(huì)發(fā)生改變,刪除字節(jié)后的第j個(gè)數(shù)據(jù)塊 作為第i+Ι個(gè)數(shù)據(jù)塊,隨后的數(shù)據(jù)塊的索引編號(hào)也發(fā)生相應(yīng)改變,隨后的數(shù)據(jù)塊的起始位 置-k。
[0109] 增加或者刪除字節(jié)后,依據(jù)上述方法,會(huì)生成新的head信息,即SB,系統(tǒng)將S B發(fā)送 給第一裝置,由此進(jìn)入了第一裝置的同步階段。
[0110] 如圖3所示,本實(shí)施例提供了一種基于上述文件分塊方法的單文件同步方法,包 括以下步驟:
[0111] S201 :第一裝置接收到第二裝置對(duì)文件B增加 k字節(jié)或刪除k字節(jié)生成的文件頭 SB;
[0112] S202 :第一裝置比對(duì)本地文件A的文件頭SA和SB,生成SA和SB的差異信息;
[0113] S203 :第一裝置將所述差異信息發(fā)送至第二裝置;
[0114] S204 :第二裝置根據(jù)所述差異信息和修改后的文件B,向第一裝置返回重構(gòu)所述 本地文件A所需的數(shù)據(jù)信息;
[0115] S205 :第一裝置根據(jù)所述數(shù)據(jù)信息更新所述本地文件A。
[0116] 其中,所述第一裝置為服務(wù)器,所述第二裝置為客戶端;或者,所述第一裝置為客 戶端,所述第二裝置為服務(wù)器。
[0117] 其中,對(duì)于增加字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè) 數(shù)據(jù)塊和新增數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù);
[0118] 對(duì)于刪除字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè)數(shù)據(jù)塊 和第i+Ι個(gè)數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù)。
[0119] 具體地,對(duì)于增加字節(jié),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小 于等于K,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù) 數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù) 據(jù)塊的長(zhǎng)度大于K甚至nK,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值 和長(zhǎng)度,所述新增數(shù)據(jù)塊的分塊信息包括:新增數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào), 所述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào);
[0120] 對(duì)于刪除字節(jié),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,所述 第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù)數(shù)據(jù)塊的分塊信息 包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至 刪除至第j個(gè)數(shù)據(jù)塊,所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度, 所述第i+Ι個(gè)數(shù)據(jù)塊的分塊信息包括:第i+Ι個(gè)數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào), 所述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào)。
[0121] 在步驟S202中,所述第一裝置將本地文件A的頭文件SA和SB進(jìn)行比對(duì),生成5 4和 SB的差異信息,包括:
[0122] 根據(jù)SA和SB計(jì)算文件B總數(shù)據(jù)塊減去文件A總數(shù)據(jù)塊的差值N ;
[0123] 從兩個(gè)文件的第一個(gè)數(shù)據(jù)塊開始比對(duì),直到找到第一個(gè)校驗(yàn)值不同的兩個(gè)數(shù)據(jù) 塊;
[0124] 如果N = 0,則記錄文件B的該數(shù)據(jù)塊的分塊信息以及后續(xù)數(shù)據(jù)塊的分塊信息(對(duì) 應(yīng)于增加或刪除字節(jié)而沒(méi)有影響數(shù)據(jù)塊分塊個(gè)數(shù)的情況);
[0125] 如果N為正整數(shù),則記錄文件B的該數(shù)據(jù)塊、后續(xù)N個(gè)數(shù)據(jù)塊以及第N個(gè)數(shù)據(jù)塊之 后的數(shù)據(jù)塊的分塊信息(對(duì)應(yīng)于增加字節(jié)后增加了數(shù)據(jù)塊的情況,該數(shù)據(jù)塊對(duì)應(yīng)第i個(gè)數(shù) 據(jù)塊,后續(xù)N個(gè)數(shù)據(jù)塊對(duì)應(yīng)新增數(shù)據(jù)塊);
[0126] 如果N為負(fù)整數(shù),則記錄文件B的該數(shù)據(jù)塊、其后第(-N+1)個(gè)數(shù)據(jù)塊及其后續(xù)的 數(shù)據(jù)塊的分塊信息(對(duì)應(yīng)于刪除字節(jié)后減少數(shù)據(jù)塊的情況,該數(shù)據(jù)塊對(duì)應(yīng)第i個(gè)數(shù)據(jù)塊,其 后第(-N+1)個(gè)數(shù)據(jù)塊對(duì)應(yīng)第i+Ι個(gè)數(shù)據(jù)塊)。
[0127] 在步驟S204中,第二裝置接收到上述差異信息后,根據(jù)所述差異信息和修改后的 文件B,向第一裝置返回重構(gòu)所述本地文件A所需的數(shù)據(jù)信息,例如,對(duì)于校驗(yàn)信息不同的 數(shù)據(jù)塊,傳輸相應(yīng)的數(shù)據(jù)塊內(nèi)容的指示;對(duì)于新增加的數(shù)據(jù)塊,傳輸新增的數(shù)據(jù)塊內(nèi)容;對(duì) 于缺失的數(shù)據(jù)塊,刪除相應(yīng)的數(shù)據(jù)塊。這里與現(xiàn)有技術(shù)中服務(wù)器對(duì)客戶端的修改進(jìn)行同步 的方法相同,此處不再贅述。
[0128] 作為一種優(yōu)選的方式,為了減少文件切片碎片,本實(shí)施例設(shè)置定期的文件重切塊 操作。當(dāng)?shù)谝谎b置與第二裝置完成同步后,第一裝置根據(jù)本地文件A的文件頭S A中記錄的 所有數(shù)據(jù)塊的長(zhǎng)度以及數(shù)據(jù)塊總數(shù),計(jì)算一個(gè)數(shù)據(jù)塊的長(zhǎng)度平均值,如果所述數(shù)據(jù)塊的長(zhǎng) 度平均值小于預(yù)設(shè)閾值,則所述第一裝置對(duì)所述本地文件A以K為一個(gè)數(shù)據(jù)塊的長(zhǎng)度重新 分塊,并通知第二裝置以相同的方式對(duì)文件B重新分塊,并計(jì)算校驗(yàn)值,生成新的SA和SB。
[0129] 由于刪除字節(jié)時(shí),不會(huì)重新進(jìn)行文件切割。因此,優(yōu)選地,本實(shí)施例可以選擇在增 加字節(jié)時(shí)進(jìn)行文件碎片檢查。用戶增加了字節(jié)時(shí),當(dāng)?shù)谝谎b置端與用戶端完成同步后,第 一裝置讀取根據(jù)S A中的記錄,計(jì)算一個(gè)數(shù)據(jù)塊的長(zhǎng)度平均值,如果過(guò)低,則表示文件碎片較 多。此時(shí),第一裝置和第二裝置均將對(duì)文件A和文件B重新分塊,并計(jì)算校驗(yàn)值,生成新的 3&和&。分塊過(guò)程中,以K為數(shù)據(jù)塊大小,只有最后一個(gè)切塊的大小會(huì)小于K。由于重切塊 發(fā)生于文件同步之后,因此,新生成的3 4和SB是一致的。
[0130] 若以第一裝置對(duì)文件修改為例,與上述方式是類似的,只是兩個(gè)執(zhí)行的裝置互換。
[0131] 如圖4所示,本實(shí)施例提供了一種單文件同步系統(tǒng),包括:基于文件分塊的文件修 改裝置(即上文提到的第二裝置)和基于文件修改裝置的單文件同步裝置(即上文提到的 第一裝置),其中:
[0132] 所述單文件同步裝置為服務(wù)器,所述文件分塊裝置為客戶端;或者,所述單文件同 步裝置為客戶端,所述文件分塊裝置為服務(wù)器。
[0133] 文件分塊裝置,包括:
[0134] 劃分模塊,用于以K為數(shù)據(jù)塊的固定長(zhǎng)度,采用定長(zhǎng)的分塊方法將所述文件劃分 為多個(gè)數(shù)據(jù)塊,并在文件頭中記錄所有數(shù)據(jù)塊的分塊信息,所述分塊信息包括:數(shù)據(jù)塊的總 塊數(shù)以及每個(gè)數(shù)據(jù)塊的偏移值、長(zhǎng)度、校驗(yàn)值、索引編號(hào)以及實(shí)際存儲(chǔ)的位置鏈接;
[0135] 修改模塊,用于當(dāng)在文件中增加字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該 數(shù)據(jù)塊的長(zhǎng)度小于等于K,則合成新的第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后, 該數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則從增加字節(jié)處,連續(xù)截取長(zhǎng)為K的數(shù)據(jù)塊,直至最后一個(gè) 數(shù)據(jù)塊的長(zhǎng)度小于K,i、k、η、Κ均為大于等于1的整數(shù),至此文件分塊結(jié)束;
[0136] 當(dāng)在文件中刪除字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù) 塊,則將刪除k字節(jié)后的數(shù)據(jù)塊作為第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì) 刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù)塊,j>i>〇,則將刪除字節(jié)起始位置之前的數(shù)據(jù)塊 作為第i個(gè)數(shù)據(jù)塊,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊作為第i+ι個(gè)數(shù) 據(jù)塊,至此文件分塊結(jié)束;
[0137] 當(dāng)在文件中增加字節(jié)或者刪除字節(jié)時(shí),在文件分塊結(jié)束后,更新頭文件中的分塊 信息。
[0138] 發(fā)送模塊,用于將生成的頭文件發(fā)送至單文件同步裝置。
[0139] 其中,所述修改模塊,用于當(dāng)在文件中增加字節(jié)時(shí),在文件分塊結(jié)束后,更新文件 頭中的分塊信息,包括:
[0140] 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于等于K,合成新的第i 個(gè)數(shù)據(jù)塊后,重新計(jì)算該數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值 +k,并記錄在文件頭中;
[0141] 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則在文件分 塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為Κ,計(jì)算新增數(shù)據(jù)塊的校 驗(yàn)值、偏移值、長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值+k,并修改各個(gè)數(shù)據(jù)塊的索引 編號(hào),記錄在文件頭中;
[0142] 所述修改模塊,用于當(dāng)在文件中刪除字節(jié)時(shí),所述在文件分塊結(jié)束后,更新頭文件 中的分塊信息,包括:
[0143] 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,則重新計(jì)算該數(shù)據(jù)塊 的校驗(yàn)值和長(zhǎng)度,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值_k,并記錄在頭文件中;
[0144] 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù) 塊,j>i>〇,則在文件分塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為刪 除字節(jié)起始位置之前的數(shù)據(jù)塊長(zhǎng)度,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊 作為第i+Ι個(gè)數(shù)據(jù)塊,更新所述第i+Ι個(gè)數(shù)據(jù)塊的偏移值為刪除字節(jié)的起始位置、更新其數(shù) 據(jù)塊長(zhǎng)度為自刪除字節(jié)的起始位置起至第j個(gè)數(shù)據(jù)塊結(jié)束的長(zhǎng)度-k,并計(jì)算所述第i+Ι個(gè) 數(shù)據(jù)塊的校驗(yàn)值,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值-k,并修改后續(xù)數(shù)據(jù)塊的索引編號(hào), 記錄在文件頭中。
[0145] 其中,單文件同步裝置,包括:
[0146] 接收模塊,用于接收文件分塊裝置對(duì)文件B增加 k字節(jié)或刪除k字節(jié)后生成的文 件頭SB,還用于接收所述文件分塊裝置返回重構(gòu)本地文件A所需的數(shù)據(jù)信息;
[0147] 差異信息生成模塊,用于比對(duì)本地文件A的文件頭SA和SB,生成S A和SB的差異信 息;
[0148] 同步模塊,用于將所述差異信息發(fā)送至文件分塊裝置,并,根據(jù)所述文件分塊裝置 返回的重構(gòu)本地文件A所需的數(shù)據(jù)信息更新所述本地文件A。
[0149] 其中,對(duì)于增加字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè) 數(shù)據(jù)塊和新增數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù);
[0150] 對(duì)于刪除字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè)數(shù)據(jù)塊 和第i+ι個(gè)數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù)。
[0151] 其中,對(duì)于增加字節(jié),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于 等于K,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù)數(shù) 據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù) 塊的長(zhǎng)度大于K甚至nK,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和 長(zhǎng)度,所述新增數(shù)據(jù)塊的分塊信息包括:新增數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào),所 述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào);
[0152] 對(duì)于刪除字節(jié),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,所述 第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù)數(shù)據(jù)塊的分塊信息 包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至 刪除至第j個(gè)數(shù)據(jù)塊,所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度, 所述第i+Ι個(gè)數(shù)據(jù)塊的分塊信息包括:第i+Ι個(gè)數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào), 所述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào)。
[0153] 其中,所述差異信息生成模塊,用于將本地文件A的頭文件SA和SB進(jìn)行比對(duì),生成 3&和S B的差異信息,包括:
[0154] 根據(jù)SA和SB計(jì)算文件B總數(shù)據(jù)塊減去文件A總數(shù)據(jù)塊的差值N ;
[0155] 從兩個(gè)文件的第一個(gè)數(shù)據(jù)塊開始比對(duì),直到找到第一個(gè)校驗(yàn)值不同的兩個(gè)數(shù)據(jù) 塊;
[0156] 如果N = 0,則記錄文件B的該數(shù)據(jù)塊的分塊信息以及后續(xù)數(shù)據(jù)塊的分塊信息(對(duì) 應(yīng)于增加或刪除字節(jié)而沒(méi)有影響數(shù)據(jù)塊分塊個(gè)數(shù)的情況);
[0157] 如果N為正整數(shù),則記錄文件B的該數(shù)據(jù)塊、后續(xù)N個(gè)數(shù)據(jù)塊以及第N個(gè)數(shù)據(jù)塊之 后的數(shù)據(jù)塊的分塊信息(對(duì)應(yīng)于增加字節(jié)后增加了數(shù)據(jù)塊的情況,該數(shù)據(jù)塊對(duì)應(yīng)第i個(gè)數(shù) 據(jù)塊,后續(xù)N個(gè)數(shù)據(jù)塊對(duì)應(yīng)新增數(shù)據(jù)塊);
[0158] 如果N為負(fù)整數(shù),則記錄文件B的該數(shù)據(jù)塊、其后第(-N+1)個(gè)數(shù)據(jù)塊及其后續(xù)的 數(shù)據(jù)塊的分塊信息(對(duì)應(yīng)于刪除字節(jié)后減少數(shù)據(jù)塊的情況,該數(shù)據(jù)塊對(duì)應(yīng)第i個(gè)數(shù)據(jù)塊,其 后第(-N+1)個(gè)數(shù)據(jù)塊對(duì)應(yīng)第i+Ι個(gè)數(shù)據(jù)塊)。
[0159] 從上述實(shí)施例可以看出,相對(duì)于現(xiàn)有技術(shù),上述實(shí)施例中提供的文件分塊方法及 裝置、文件同步方法及裝置,具有以下有益效果:
[0160] 1)對(duì)文件的修改只影響增加或刪除字節(jié)位置附近的數(shù)據(jù)塊信息,因此,對(duì)文件切 片影響較小,在同步文件時(shí),只需要更新增加或刪除字節(jié)位置附近的數(shù)據(jù)塊的信息,傳輸?shù)?文件內(nèi)容也相應(yīng)減少;2)文件切片大小不會(huì)無(wú)限制大,系統(tǒng)設(shè)計(jì)人員可根據(jù)系統(tǒng)的承受能 力設(shè)計(jì)K值,以平衡管理復(fù)雜性和文件傳輸代價(jià);3)杜絕了大量文件碎片。
[0161] 本領(lǐng)域普通技術(shù)人員可以理解上述方法中的全部或部分步驟可通過(guò)程序來(lái)指令 相關(guān)硬件完成,所述程序可以存儲(chǔ)于計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,如只讀存儲(chǔ)器、磁盤或光盤 等。可選地,上述實(shí)施例的全部或部分步驟也可以使用一個(gè)或多個(gè)集成電路來(lái)實(shí)現(xiàn)。相應(yīng) 地,上述實(shí)施例中的各模塊/單元可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能模塊的 形式實(shí)現(xiàn)。本發(fā)明不限制于任何特定形式的硬件和軟件的結(jié)合。
[0162] 以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。根據(jù) 本發(fā)明的
【發(fā)明內(nèi)容】
,還可有其他多種實(shí)施例,在不背離本發(fā)明精神及其實(shí)質(zhì)的情況下,熟悉 本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變和變形,凡在本發(fā)明的精神和原則 之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1. 一種基于文件分塊的文件修改方法,包括: 以K為數(shù)據(jù)塊的固定長(zhǎng)度,采用定長(zhǎng)的分塊方法將所述文件劃分為多個(gè)數(shù)據(jù)塊,并在 文件頭中記錄所有數(shù)據(jù)塊的分塊信息,所述分塊信息包括:數(shù)據(jù)塊的總塊數(shù)以及每個(gè)數(shù)據(jù) 塊的偏移值、長(zhǎng)度、校驗(yàn)值、索引編號(hào)以及實(shí)際存儲(chǔ)的位置鏈接; 當(dāng)在文件中增加字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于等 于K,則合成新的第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度大 于K甚至nK,則從增加字節(jié)處,連續(xù)截取長(zhǎng)為K的數(shù)據(jù)塊,直至最后一個(gè)數(shù)據(jù)塊的長(zhǎng)度小于 K,i、k、η、Κ均為大于0的正整數(shù),至此文件分塊結(jié)束; 當(dāng)在文件中刪除字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊, 則將刪除k字節(jié)后的數(shù)據(jù)塊作為第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除 至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù)塊,j>i>〇,則將刪除字節(jié)起始位置之前的數(shù)據(jù)塊作為 第i個(gè)數(shù)據(jù)塊,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊作為第i+Ι個(gè)數(shù)據(jù)塊, 至此文件分塊結(jié)束; 當(dāng)在文件中增加字節(jié)或者刪除字節(jié)時(shí),在文件分塊結(jié)束后,更新文件頭中的分塊信息。
2. 如權(quán)利要求1所述的方法,其特征在于: 所述當(dāng)在文件中增加字節(jié)時(shí),在文件分塊結(jié)束后,更新文件頭中的分塊信息,包括: 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于等于K,合成新的第i個(gè)數(shù) 據(jù)塊后,重新計(jì)算該數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值+k,并 記錄在文件頭中; 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則在文件分塊結(jié) 束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為Κ,計(jì)算新增數(shù)據(jù)塊的校驗(yàn)值、 偏移值、長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值+k,并修改各個(gè)數(shù)據(jù)塊的索引編號(hào), 記錄在文件頭中。
3. 如權(quán)利要求1所述的方法,其特征在于: 所述當(dāng)在文件中刪除字節(jié)時(shí),所述在文件分塊結(jié)束后,更新頭文件中的分塊信息,包 括: 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,則重新計(jì)算該數(shù)據(jù)塊的校 驗(yàn)值和長(zhǎng)度,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值_k,并記錄在文件頭中; 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù)塊, 則在文件分塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為刪除 字節(jié)起始位置之前的數(shù)據(jù)塊長(zhǎng)度,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊作 為第i+Ι個(gè)數(shù)據(jù)塊,更新所述第i+Ι個(gè)數(shù)據(jù)塊的偏移值為刪除字節(jié)的起始位置、更新其數(shù)據(jù) 塊長(zhǎng)度為自刪除字節(jié)的起始位置起至第j個(gè)數(shù)據(jù)塊結(jié)束的長(zhǎng)度-k,并計(jì)算所述第i+Ι個(gè)數(shù) 據(jù)塊的校驗(yàn)值,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值-k,并修改后續(xù)數(shù)據(jù)塊的索引編號(hào),記 錄在文件頭中。
4. 一種基于如權(quán)利要求1或2或3所述的文件修改方法的單文件同步方法,包括: 第一裝置接收到第二裝置對(duì)文件B增加 k字節(jié)或刪除k字節(jié)后生成的文件頭SB ; 第一裝置將本地文件A的文件頭SA和SB進(jìn)行比對(duì),生成SA和S B的差異信息; 第一裝置將所述差異信息發(fā)送至第二裝置; 第二裝置根據(jù)所述差異信息和修改后的文件B,向第一裝置返回重構(gòu)所述本地文件A 所需的數(shù)據(jù)信息,第一裝置根據(jù)所述數(shù)據(jù)信息更新所述本地文件A ; 其中,所述第一裝置為服務(wù)器,所述第二裝置為客戶端;或者,所述第一裝置為客戶端, 所述第二裝置為服務(wù)器。
5. 如權(quán)利要求4所述的方法,其特征在于: 對(duì)于增加字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè)數(shù)據(jù)塊和新 增數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù); 對(duì)于刪除字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè)數(shù)據(jù)塊和第 i+Ι個(gè)數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù)。
6. 如權(quán)利要求5所述的方法,其特征在于: 對(duì)于增加字節(jié),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于等于K,則所 述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù)數(shù)據(jù)塊的分塊信 息包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度大于 K甚至nK,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述新增 數(shù)據(jù)塊的分塊信息包括:新增數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào),所述后續(xù)數(shù)據(jù)塊 的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào); 對(duì)于刪除字節(jié),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,所述第i 個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù)數(shù)據(jù)塊的分塊信息包 括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至刪 除至第j個(gè)數(shù)據(jù)塊,所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所 述第i+Ι個(gè)數(shù)據(jù)塊的分塊信息包括:第i+Ι個(gè)數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào),所 述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào)。
7. 如權(quán)利要求6所述的方法,其特征在于: 所述第一裝置將本地文件A的頭文件SA和SB進(jìn)行比對(duì),生成SA和S B的差異信息,包 括: 根據(jù)SA和SB計(jì)算文件B總數(shù)據(jù)塊減去文件A總數(shù)據(jù)塊的差值N ; 從兩個(gè)文件的第一個(gè)數(shù)據(jù)塊開始比對(duì),直到找到第一個(gè)校驗(yàn)值不同的兩個(gè)數(shù)據(jù)塊; 如果N = 0,則記錄文件B的該數(shù)據(jù)塊的分塊信息以及后續(xù)數(shù)據(jù)塊的分塊信息; 如果N為正整數(shù),則記錄文件B的該數(shù)據(jù)塊、后續(xù)N個(gè)數(shù)據(jù)塊以及第N個(gè)數(shù)據(jù)塊之后的 數(shù)據(jù)塊的分塊信息; 如果N為負(fù)整數(shù),則記錄文件B的該數(shù)據(jù)塊、其后第(-N+1)個(gè)數(shù)據(jù)塊及其后續(xù)的數(shù)據(jù) 塊的分塊信息。
8. 如權(quán)利要求4所述的方法,其特征在于: 當(dāng)?shù)谝谎b置與第二裝置完成同步后,第一裝置根據(jù)本地文件A的文件頭SA中記錄的所 有數(shù)據(jù)塊的長(zhǎng)度以及數(shù)據(jù)塊總數(shù),計(jì)算一個(gè)數(shù)據(jù)塊的長(zhǎng)度平均值,如果所述數(shù)據(jù)塊的長(zhǎng)度 平均值小于預(yù)設(shè)閾值,則所述第一裝置對(duì)所述本地文件A以K為一個(gè)數(shù)據(jù)塊的長(zhǎng)度重新分 塊,并通知第二裝置以相同的方式對(duì)文件B重新分塊,并計(jì)算校驗(yàn)值,生成新的S A和SB。
9. 一種基于文件分塊的文件修改裝置,包括: 劃分模塊,用于以K為數(shù)據(jù)塊的固定長(zhǎng)度,采用定長(zhǎng)的分塊方法將所述文件劃分為多 個(gè)數(shù)據(jù)塊,并在文件頭中記錄所有數(shù)據(jù)塊的分塊信息,所述分塊信息包括:數(shù)據(jù)塊的總塊數(shù) 以及每個(gè)數(shù)據(jù)塊的偏移值、長(zhǎng)度、校驗(yàn)值、索引編號(hào)以及實(shí)際存儲(chǔ)的位置鏈接; 修改模塊,用于當(dāng)在文件中增加字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù) 塊的長(zhǎng)度小于等于K,則合成新的第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該 數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則從增加字節(jié)處,連續(xù)截取長(zhǎng)為K的數(shù)據(jù)塊,直至最后一個(gè)數(shù) 據(jù)塊的長(zhǎng)度小于K,i、k、η、Κ均為大于等于1的整數(shù),至此文件分塊結(jié)束; 當(dāng)在文件中刪除字節(jié)時(shí),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊, 則將刪除k字節(jié)后的數(shù)據(jù)塊作為第i個(gè)數(shù)據(jù)塊;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除 至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù)塊,j>i>〇,則將刪除字節(jié)起始位置之前的數(shù)據(jù)塊作為 第i個(gè)數(shù)據(jù)塊,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊作為第i+Ι個(gè)數(shù)據(jù)塊, 至此文件分塊結(jié)束; 當(dāng)在文件中增加字節(jié)或者刪除字節(jié)時(shí),在文件分塊結(jié)束后,更新頭文件中的分塊信 息; 發(fā)送模塊,用于將更新的頭文件發(fā)送至單文件同步裝置。
10. 如權(quán)利要求9所述的裝置,其特征在于: 所述修改模塊,用于當(dāng)在文件中增加字節(jié)時(shí),在文件分塊結(jié)束后,更新頭文件中的分塊 信息,包括: 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于等于K,合成新的第i個(gè)數(shù) 據(jù)塊后,重新計(jì)算該數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值+k,并 記錄在文件頭中; 如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度大于K甚至nK,則在文件分塊結(jié) 束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為Κ,計(jì)算新增數(shù)據(jù)塊的校驗(yàn)值、 偏移值、長(zhǎng)度,并修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值+k,并修改各個(gè)數(shù)據(jù)塊的索引編號(hào), 記錄在頭文件中; 所述修改模塊,用于當(dāng)在文件中刪除字節(jié)時(shí),所述在文件分塊結(jié)束后,更新頭文件中的 分塊信息,包括: 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,則重新計(jì)算該數(shù)據(jù)塊的校 驗(yàn)值和長(zhǎng)度,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值_k,并記錄在頭文件中; 如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至刪除至第j個(gè)數(shù)據(jù)塊, 則在文件分塊結(jié)束后,計(jì)算所述第i個(gè)數(shù)據(jù)塊的校驗(yàn)值,更新其數(shù)據(jù)塊長(zhǎng)度為刪除 字節(jié)起始位置之前的數(shù)據(jù)塊長(zhǎng)度,將刪除字節(jié)至第j個(gè)數(shù)據(jù)塊的結(jié)束位置之后的數(shù)據(jù)塊作 為第i+Ι個(gè)數(shù)據(jù)塊,更新所述第i+Ι個(gè)數(shù)據(jù)塊的偏移值為刪除字節(jié)的起始位置、更新其數(shù)據(jù) 塊長(zhǎng)度為自刪除字節(jié)的起始位置起至第j個(gè)數(shù)據(jù)塊結(jié)束的長(zhǎng)度-k,并計(jì)算所述第i+Ι個(gè)數(shù) 據(jù)塊的校驗(yàn)值,修改后續(xù)數(shù)據(jù)塊的偏移值為原偏移值-k,并修改后續(xù)數(shù)據(jù)塊的索引編號(hào),記 錄在頭文件中。
11. 一種基于如權(quán)利要求9或10所述的文件修改裝置的單文件同步裝置,包括: 接收模塊,用于接收文件分塊裝置對(duì)文件B增加 k字節(jié)或刪除k字節(jié)后生成的文件頭 SB,還用于接收所述文件分塊裝置返回重構(gòu)所述本地文件A所需的數(shù)據(jù)信息; 差異信息生成模塊,用于將本地文件A的頭文件SA和SB進(jìn)行比對(duì),生成SA和S B的差異 信息; 同步模塊,用于將所述差異信息發(fā)送至所述文件分塊裝置,并根據(jù)所述文件分塊裝置 返回的重構(gòu)所述本地文件A所需的數(shù)據(jù)信息更新所述本地文件A。
12. 如權(quán)利要求11所述的裝置,其特征在于: 對(duì)于增加字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè)數(shù)據(jù)塊和新 增數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù); 對(duì)于刪除字節(jié),所述差異信息包括:第i個(gè)數(shù)據(jù)塊的分塊信息,或者,第i個(gè)數(shù)據(jù)塊和第 i+Ι個(gè)數(shù)據(jù)塊的分塊信息,以及后續(xù)數(shù)據(jù)塊的分塊信息和數(shù)據(jù)塊的總塊數(shù)。
13. 如權(quán)利要求12所述的裝置,其特征在于: 對(duì)于增加字節(jié),如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度小于等于K,則所 述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù)數(shù)據(jù)塊的分塊信 息包括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中增加 k字節(jié)后,該數(shù)據(jù)塊的長(zhǎng)度大于 K甚至nK,則所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述新增 數(shù)據(jù)塊的分塊信息包括:新增數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào),所述后續(xù)數(shù)據(jù)塊 的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào); 對(duì)于刪除字節(jié),如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),不會(huì)刪除至下一數(shù)據(jù)塊,所述第i 個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所述后續(xù)數(shù)據(jù)塊的分塊信息包 括:后續(xù)數(shù)據(jù)塊的偏移值;如果在第i個(gè)數(shù)據(jù)塊中刪除k字節(jié),會(huì)刪除至下一數(shù)據(jù)塊甚至刪 除至第j個(gè)數(shù)據(jù)塊,所述第i個(gè)數(shù)據(jù)塊的分塊信息包括:第i個(gè)數(shù)據(jù)塊的校驗(yàn)值和長(zhǎng)度,所 述第i+Ι個(gè)數(shù)據(jù)塊的分塊信息包括:第i+Ι個(gè)數(shù)據(jù)塊的校驗(yàn)值、長(zhǎng)度、偏移值和索引編號(hào),所 述后續(xù)數(shù)據(jù)塊的分塊信息包括:后續(xù)數(shù)據(jù)塊的偏移值和索引編號(hào)。
14. 如權(quán)利要求13所述的裝置,其特征在于: 所述差異信息生成模塊,用于將本地文件A的頭文件SA和SB進(jìn)行比對(duì),生成SA和S B的 差異信息,包括: 根據(jù)SA和SB計(jì)算文件B總數(shù)據(jù)塊減去文件A總數(shù)據(jù)塊的差值N ; 從兩個(gè)文件的第一個(gè)數(shù)據(jù)塊開始比對(duì),直到找到第一個(gè)校驗(yàn)值不同的兩個(gè)數(shù)據(jù)塊; 如果N = 0,則記錄文件B的該數(shù)據(jù)塊的分塊信息以及后續(xù)數(shù)據(jù)塊的分塊信息; 如果N為正整數(shù),則記錄文件B的該數(shù)據(jù)塊、后續(xù)N個(gè)數(shù)據(jù)塊以及第N個(gè)數(shù)據(jù)塊之后的 數(shù)據(jù)塊的分塊信息; 如果N為負(fù)整數(shù),則記錄文件B的該數(shù)據(jù)塊、其后第(-N+1)個(gè)數(shù)據(jù)塊及其后續(xù)的數(shù)據(jù) 塊的分塊信息。
15. -種單文件同步系統(tǒng),包括:如權(quán)利要求9?10所述的文件修改裝置和如權(quán)利要 求11?14所述的單文件同步裝置; 其中,所述文件修改裝置為服務(wù)器,所述單文件同步裝置為客戶端;或者,所述文件修 改裝置為客戶端,所述單文件同步裝置為服務(wù)器。
【文檔編號(hào)】H04L29/08GK104092780SQ201410368093
【公開日】2014年10月8日 申請(qǐng)日期:2014年7月29日 優(yōu)先權(quán)日:2014年7月29日
【發(fā)明者】王淑玲, 張?jiān)朴? 房秉毅 申請(qǐng)人:中國(guó)聯(lián)合網(wǎng)絡(luò)通信集團(tuán)有限公司