dcc文件的前3行是版本和校验信息,跟着的每一行代表一个文件,每一行的前半部分是相对目录的hash,后半部分是文件内容的hash。相对目录只是一个数字,已经无法根据这个数字直接恢复原始文件名称了。好在update目录下还有一个allfiles.txt,他跟filetable.txt正好是一一对应的。即filetable.txt的第4行对应allfiles.txt的第一行,以此类推,就能知道每个文件对应的dcc目录id和内容hash值。 至于filetable1.txt,是历史遗留文件,已经不用了。
filetable.bin是filetable.txt的二进制版本,也是实际使用的文件。
但是你知道了这些并不能立即用来做差异化更新,因为dcc文件是完整的校验值,并不是只包含差异文件,只有跟本地保存的filetable.txt比较之后,才能知道差异的文件。
你的需求可以通过简单的在一开始就下载allfiles.txt中的所有文件来实现。流程如下:
1. 完成引擎原来的dcc更新流程,获得最新的filetable文件。
2. 下在allfiles.txt,解析获得所有文件列表。
3. 循环下载列表中所有的文件,如果相应的文件没有更新,就会直接忽略过去,如果需要更新就会去下载实际文件,并更新本地缓存。
4. 更新进度。如果大部分文件都没变,可能进度会不均匀。