2013-02-23 195 views
4

我想要做什么:文件更改事件网络共享

我有两个目录。每个包含大约90.000 xml和bak文件。

我需要xml文件在文件更改时在两个文件夹同步(当然应该复制新的文件)。

的问题是:

由于文件量庞大和事实目录之一是网络共享,我不能只是循环尽管目录和比较os.path.getmtime(file)值。

即使看门狗和PyQt不工作(尝试从herehere解决方案)。

问题:

是否有任何其他方式来获取文件更改事件(Windows系统),无需循环尽管所有这些文件对于那些配置工作?

+1

我非常怀疑你可以从网络共享中获得有意义的文件系统通知。 – millimoose 2013-02-23 21:38:58

+0

这就是为什么我在这里问的问题......如果没有办法在当前配置上执行此操作,我可能会切换到ftp并使用ftplib获取时间+文件 – chill0r 2013-02-23 22:23:01

+1

您可以创建在两台机器上运行的服务,文件夹;当文件发生变化时,捕获这个事件(或者使用@ Jon-Eric链接中的最后一个例子,或者使用C#编写一个服务并使用FIleSystemWatcher组件。 当您检测到更改时,将此更改写入文件或消息队列或数据库或任何其他机器,并让其他机器轮询,以获得重新同步的文件列表。 但是,当您更改文件时,您还需要为“同步”的工作原理构建一些协议同时在两台电脑:) – 2013-02-24 13:58:23

回答

1

所以,我终于找到了解决办法: 我改变了我的一些网络共享设置和使用的FileSystemWatcher

为了防止文件得到同步的同步我使用的是MD5 filehash。

我使用的代码可以在pastebin找到(这是一个快速和肮脏的代码,只是在这里的问题中提到的部分)。

1

我敢冒险给出一个答案,这里的路(你没有指定速度等要求),但... Dropbox会为你免费完成,并且根本不需要编写任何代码。

当然,如果你需要实时同步,或者你想避免与第三方“共享”文件(尽管你可以先加密),它可能不适合你的需要。

0

从提到看门狗,我假设你在Linux下运行。对于本地机器来说,inotify可以提供帮助,但对于网络共享而言,您运气不佳。 Mercurial的inotify扩展http://hgbook.red-bean.com/read/adding-functionality-with-extensions.html具有相同的限制。

在类似的情况下(10K +文件),我在服务器和本地机器上都使用了一个克隆的mercurial存储库,其中包含inotify。他们自动提交并通知对方的变化。它有一个小小的延迟(对我来说没有问题),但作为一个好处,有一个完整的历史记录变化,并且在其中一个系统关闭后很容易重新生成。

+0

“是否有任何其他方式获得文件更改事件(在Windows系统上)适用于这些配置但不循环所有这些文件? “ Windows Server 2008,所以它不工作。 但是我今天发现了我自己的解决方案(我将它添加为答案,虽然因为答案与我的问题最接近,所以得到了赏金) – chill0r 2013-03-08 14:55:00

+0

对不起,我没有阅读过关于看门狗的参考文献。我曾经看过Tim Golden的东西,但我在Windows上工作不多。我会看看类似于上面的设置,其中包括Windows客户端,看看是否可行。 – Anthon 2013-03-09 13:07:27