当应用程序未运行时,dropbox用于识别本地更改的文件/文件夹列表的算法是什么?

时间:2015-01-31 02:21:20

标签: algorithm dropbox sync

据我所知,当应用程序使用某些操作系统事件运行时,我们可以识别文件系统中的更改。我只是想知道应用程序何时没有运行,如果我对文件系统进行了大量更改,例如添加/修改/删除/重命名少数文件和文件夹,Dropbox使用什么算法来识别这些更改。我能想到的一件事是,通过将文件系统上文件的上次修改时间与应用程序运行时的LMT存储值进行比较。在这种情况下,我们不得不循环遍历所有文件。但是,如果我们重命名,LMT不会改变。只是想看看有没有更好的方法,因为依赖LMT有自己的问题?

有任何意见吗?

1 个答案:

答案 0 :(得分:3)

我不知道Dropbox是如何处理它的,但这是一个可能有用的策略:

您有一个Dropbox处理的根目录。如果我是Dropbox,我会为服务器上的每个文件保留哈希值。从根开始,应用程序将扫描文件树(目录+文件)并计算每个文件的哈希值。

扫描将导致双索引哈希表。每个文件和目录都将使用其相对路径(来自根Dropbox目录)进行索引。第二个索引将使用每个文件的哈希值进行。

现在,该应用已扫描并建立了双索引哈希表。然后服务器将发送元组(相对路径文件的哈希)。设( f h )就是这样一个文件元组:

  1. 该应用会尝试使用 f 通过路径索引获取文件:
    1. 如果有结果,请比较哈希值。如果它们不匹配,请更新远程服务器上的文件
    2. 如果没有结果,文件可能已被删除或移动/重命名。然后,应用程序尝试使用 h 通过哈希索引获取文件:如果存在匹配,则表示该文件仅在不同的路径下(因此移动或重命名)。应用程序发送信息,并在服务器上适当地移动/重命名文件。
  2. 未找到使用散列或路径的文件。它已从Dropbox文件树中删除:我们在服务器上相应地删除它。
  3. 请注意,此策略需要一种同步机制,以便在满足匹配时知道是否必须在客户端或服务器上更新文件。这可以通过存储Dropbox运行的最后一次更新的时间(在客户端和服务器上)以及执行此最后更新的人员(在服务器上)来实现。