大多数同步程序如何监视文件更改?


9

像Dropbox这样的同步程序是否通常通过逐字节比较,使用哈希或使用diff/保留本地提交日志(例如版本控制)来跟踪文件更改,或者执行什么操作?

Answers:


8

在Windows上,有一种机制可让OS在“监视”目录结构发生更改时提醒您-FindFirstChangeNotification()。当这表示文件已更改时,应用程序可以随后通过查看大小,修改日期,哈希等来比较更改后的目录中的文件,以查找实际已更改的文件。

每个平台都会以某种方式提供这一点(正如迈克尔在下面指出的那样)。我并不是说这种事情是Windows独有的。


1
在Linux上有inotify
迈克尔

但是,如果文件更改时同步程序没有运行怎么办?它会不会错过被钩子通知的机会?
mcandre

您使用了保管箱的特定示例,该示例通常在后台运行。显然,如果程序未运行,则不会收到通知。然后,它必须使用其他方法(可能是修改日期)。我不认为您将获得关于所使用的特定方法的具体答案,因为不同的程序做事的方式不同。最好询问相关特定程序的创建者。
2012年

@mcandre GrandmasterB所说的差不多-如果您错过了通知,则必须扫描该文件夹。根据您想要的“准确性”,这可能意味着仅查找新文件和修改的时间戳/文件大小(这样做相对便宜),或者在最坏的情况下,比较整个文件。像rsync的程序通常散列块文件,所以早期变化在可以更早地检测到的数据,但在最坏的情况(文件是相同的),你会读出整个事情英寸
丹尼尔乙

2

最终,要比较文件,您需要比较每个字节-您还怎么注意到一个字节的变化?

实际上,您读取字节块并计算哈希值,然后检查哈希表。一个很好的例子是“ rsync

据我所知,Dropbox仅对整个文件进行重复数据删除,因此将计算整个文件的哈希值以检查同一文件


1
pst在某些文件系统上有一个修改的日期
棘手怪胎

1
散列会不会产生很小但真正的冲突风险,从而导致文件无法同步?Dropbox显然使用了类似diff的实现。dropbox.com/help/8/en
mcandre

1
@mcandre听起来好像最好是自己的问题。
GrandmasterB 2012年

@ratchetfreak:在某些系统上,修改日期对于这种问题不一定是可靠的。简单的触摸会导致修改的日期不同,而实际上可能不需要同步。
史蒂文·埃弗斯

1
@SnOrfus然后在修改日期更改后再次检查更改
棘手怪胎

1

例如,.NET具有FileSystemWatcher类。我确信其他低级语言和运行时可以提供类似的功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.