2013-02-23 169 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