想改进一下 Gekko,让它变成一个好用的 SFTP 同步程序,而不仅仅是上传文件。从网上找了一圈,没有详细介绍文件同步原理的帖文。于是自己想了一种比较简单的实现文件同步的方法。
总流程图

一步步来看
同步开始
同步,当然就是指定两个文件夹了。一个本地的,一个远程的。如果发现远程文件夹不存在,那就好说了,直接把本地未经 “.gekkoign” 标注为忽略的文件,上传到远程就OK了。
如果远程文件夹存在,那就需要遍历全部的文件。文件的异同,无非四种情况:
- 本地有远程无
- 远程有本地无
- 本地新
- 远程新
下面就这四种情况,研究相应对策。
本地有远程无
这种情况,有两种可能性:
- 这个文件是本地新增的,未经上传。
- 这个文件在先在远程被删掉了,本地还没来得及删
忽略了一种情况:之前上传的时候,本地的这个文件没有被上传上去。随后又在远程对文件夹里内容进行了更改,导致远程文件夹修改日期比本地新。
注意,是 “没有被上传上去”,这里指的是上传过程中出现问题,而不是之前选择忽略该文件,现在不再忽略。如果是从 “.gekkoign” 文件中取消了忽略,那么文件夹的修改日期也会被更新,这个曾被忽略的文件会被按照 可能1 – 一个新建立的文件对待。
第一种可能的特征为本地文件夹修改日期比远程的新,第二种相反。这时就可以通过判断修改日期来实现同步。
此外,可以提供一个 “–no-remove-local” 开关,这样一来,远程删除文件后进行同步,本地文件得以保留而不会删除。
本地无远程有
也有两种可能性:
- 远程新增了一个文件
- 本地删除了一个文件
同样可以通过判断文件夹修改日期来区别这两种可能。若远程新增了,就下载下来。若本地删除了,就把远程的也删除。
本地新
更好说了,替换远程的就完了。
远程新
可以提供一个 “–no-modify-local” 开关,让用户来决定,替换不替换本地文件。