参考Dropbox 同步机制
1〉 运行安装程序,拷贝完系统文件到C:/Users/ThinkPad/AppData/Roaming/Dropbox目录下,要求输入网盘帐户及密码,并且马上登录帐户,获取了帐户信息,确保帐户有效性;选择本地网盘目录(默认:C:/Users/ThinkPad/Documents/My Dropbox),生成帐户文件host.db(文本文件)。
host.db的内容: l 帐户信息:用户名、密码(进行了加密,加密方法不详) l C:/Users/ThinkPad/Documents/My Dropbox (base64进行了加密) |
2〉 从host.db中取出用户名密码,进行第一次登录,登录成功,下载服务端网盘文件目录结构,并下载文件,并把用户名、密码,写入dropbox.db中的config表中,以加密的方式,用户名以base64加密,密码不确定,至此第一次登录结束。
3〉 第一次登录网盘,下载服务端网盘文件后的每一次启动,都经过系统初始化、connect网盘、获取网盘目录树(在内存里保存着网盘目录树的同步数据结构)。
4〉 比较本地目录与服务端网盘目录树,对于本地“有”而服务端没有的的文件,进行“上传文件”, 对于本地实体文件与hash块做运算,发现改动,也要上传。
5〉 对本地“没有”,而服务端有的文件,进行“删除文件”。
6〉 对copy到本地网盘对应目录中的文件,都需要上传文件,参见“上传文件机制”
7〉 删除本地文件后,删除服务端文件,并更新数据库表相关字段,置空“active_blocklist”,
active_mtime=-1;active_size=-1;on_disk=0
8〉 上传、下载文件
Dropbox中所有的同步数据是两张sqlite表格block_cache、file_jorunal,同步机制请参考如下数据库定义的字段,上传操作“active_***”字段;下载操作“updated_***”字段,下载完成后,拷贝“updated_***”字段到“active_***”相关字段中。
上传文件机制:(操作“active_字段”)
1.对拷贝到网盘的数据,需要做上传处理,在分割若干块,每块做hash和摘要处理记录在block_cache表中,同时,也记录文件的变更时间,变更尺寸,上传服务器路径。
2.对每个文件的上传操作登记在file_journal中,对一个大文件,分割后的块hash ID 记录在“hash”中,对多个块的,用分号分割。
3.下载成功后,“on_disk”置1。
跟踪结果:a. 上传完成后才更新数据库。
b. 数据库中未用到“updated_***”字段。
下载文件机制:
1.本地未找到服务端返回的文件信息。需要下载同步。
2.对每个需要下载的文件的下载操作登记在file_journal中,对一个大文件,分割后的块hash ID 记录在“hash”中,对多个块的,用分号分割。
3.下载成功后,“on_disk”置1。
block_cache说明:
编号 | 类型 | 长度 | 接口描述 |
id | INTEGER | - | 记录编号 |
hash | VARCHAR | 43 | block hash ID |
sig | TEXT | * | 摘要信息(由末尾采用“=”、“==”估计,初步认为是采用base64编码) |
size | INT | - | block size |
delete_after | INT | - | 之后从表中删除掉 |
needed_for | INT |
|
|
例子:
file_journal说明:
编号 | 类型 | 长度 | 接口描述 |
id | INTEGER | - | 记录编号 |
server_path | TEXT | * | 文件服务器路径 |
active_server_path | TEXT | * | 上传同步服务器路径(一般,内容同server_path) |
active_blocklist | TEXT | * | 上传同步block list hash ID,用分号分割 |
active_mtime | INT | - | 上传同步文件更新时间 |
active_size | INT | - | 上传同步文件更新尺寸 |
active_sjid | INT | - | 上传同步ID |
active_dir | INT | - | 上传同步是否是目录文件 |
active_attrs | TEXT | * | 上传同步文件属性(一般为空) |
updated_server_path | TEXT | * | 下载同步服务器路径(一般,内容同server_path) |
updated _blocklist | TEXT | * | 下载同步block list hash ID,用分号分割 |
updated _mtime | INT | - | 下载同步文件更新时间 |
updated _size | INT | - | 下载同步文件更新尺寸 |
updated _sjid | INT | - | 下载同步ID |
updated _dir | INT | - | 下载同步是否是目录文件 |
updated _attrs | TEXT | * | 下载同步文件属性(一般为空) |
|
|
|
|
注意:“active_***”字段用于上载用;“updated_***” 字段用于下载载用,下载主要应用于新登录到已有帐户,下载服务端网盘文件。
例子: