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

总流程图

一步步来看

同步开始

同步,当然就是指定两个文件夹了。一个本地的,一个远程的。如果发现远程文件夹不存在,那就好说了,直接把本地未经 “.gekkoign” 标注为忽略的文件,上传到远程就OK了。

如果远程文件夹存在,那就需要遍历全部的文件。文件的异同,无非四种情况:

  • 本地有远程无
  • 远程有本地无
  • 本地新
  • 远程新

下面就这四种情况,研究相应对策。

本地有远程无

这种情况,有两种可能性:

  • 这个文件是本地新增的,未经上传。
  • 这个文件在先在远程被删掉了,本地还没来得及删

忽略了一种情况:之前上传的时候,本地的这个文件没有被上传上去。随后又在远程对文件夹里内容进行了更改,导致远程文件夹修改日期比本地新。

注意,是 “没有被上传上去”,这里指的是上传过程中出现问题,而不是之前选择忽略该文件,现在不再忽略。如果是从 “.gekkoign” 文件中取消了忽略,那么文件夹的修改日期也会被更新,这个曾被忽略的文件会被按照 可能1 – 一个新建立的文件对待。

第一种可能的特征为本地文件夹修改日期比远程的新,第二种相反。这时就可以通过判断修改日期来实现同步。

此外,可以提供一个 “–no-remove-local” 开关,这样一来,远程删除文件后进行同步,本地文件得以保留而不会删除。

本地无远程有

也有两种可能性:

  • 远程新增了一个文件
  • 本地删除了一个文件

同样可以通过判断文件夹修改日期来区别这两种可能。若远程新增了,就下载下来。若本地删除了,就把远程的也删除。

本地新

更好说了,替换远程的就完了。

远程新

可以提供一个 “–no-modify-local” 开关,让用户来决定,替换不替换本地文件。

觉得不错?分享给你的小伙伴:
分类: 开发软件

发表评论

电子邮件地址不会被公开。 必填项已用*标注