我想做的事:
我有两个目录。每个包含大约 90.000 个 xml 和 bak 文件。
当文件更改时,我需要 xml 文件在两个文件夹中同步(当然应该复制较新的文件)。
问题是:
由于文件数量巨大,而且其中一个目录是网络共享,我不能只循环目录并比较os.path.getmtime(file)
值。
甚至看门狗和 PyQt 也不起作用(从这里和这里尝试了解决方案)。
问题:
有没有其他方法来获取文件更改事件(在 Windows 系统上),它适用于那些配置而不循环所有这些文件?
所以我终于找到了解决方案:我更改了一些网络共享设置并使用了FileSystemWatcher
为了防止文件在同步时同步,我使用 md5 文件哈希。
我使用的代码可以在pastebin找到(这是一个快速而肮脏的代码,只是这里的问题中提到的部分)。
我冒着给出一个离这里很远的答案的风险(你没有指定关于速度等的要求)但是...... Dropbox会免费为你做这件事,并且根本不需要编写任何代码。
当然,如果您需要实时同步,或者您想避免与第三方“共享”您的文件(尽管您可以先加密它们),它可能不适合您的需求。
提到看门狗,我假设您在 Linux 下运行。对于本地机器 inotify 可以提供帮助,但对于网络共享,您就不走运了。Mercurial 的 inotify 扩展http://hgbook.red-bean.com/read/adding-functionality-with-extensions.html 有同样的限制。
在类似的情况下(10K+ 文件),我在服务器和本地机器上都使用了带有 inotify 的克隆 mercurial 存储库。他们自动提交并通知对方更改。它有一点延迟(在我的情况下没问题),但作为一个好处,它有完整的更改历史,并且在其中一个系统关闭后很容易重新同步。