据我所知,当应用程序使用某些操作系统事件运行时,我们可以识别文件系统中的更改。我只是想知道应用程序何时没有运行,如果我对文件系统进行了大量更改,例如添加/修改/删除/重命名少数文件和文件夹,Dropbox使用什么算法来识别这些更改。我能想到的一件事是,通过将文件系统上文件的上次修改时间与应用程序运行时的LMT存储值进行比较。在这种情况下,我们不得不循环遍历所有文件。但是,如果我们重命名,LMT不会改变。只是想看看有没有更好的方法,因为依赖LMT有自己的问题?
有任何意见吗?
答案 0 :(得分:3)
我不知道Dropbox是如何处理它的,但这是一个可能有用的策略:
您有一个Dropbox处理的根目录。如果我是Dropbox,我会为服务器上的每个文件保留哈希值。从根开始,应用程序将扫描文件树(目录+文件)并计算每个文件的哈希值。
扫描将导致双索引哈希表。每个文件和目录都将使用其相对路径(来自根Dropbox目录)进行索引。第二个索引将使用每个文件的哈希值进行。
现在,该应用已扫描并建立了双索引哈希表。然后服务器将发送元组(相对路径,文件的哈希)。设( f , h )就是这样一个文件元组:
请注意,此策略需要一种同步机制,以便在满足匹配时知道是否必须在客户端或服务器上更新文件。这可以通过存储Dropbox运行的最后一次更新的时间(在客户端和服务器上)以及执行此最后更新的人员(在服务器上)来实现。