2008-12-05 45 views
2

我正在編寫一個應用程序,通過每隔幾秒輪詢目錄來監視新輸入文件的目錄。新文件通常可能是幾兆字節,因此需要一些時間才能完全到達輸入目錄(例如:從遠程共享複製)。檢測傳輸中的文件?

是否有一種簡單的方法來檢測文件當前是否正在複製過程中?理想情況下,任何方法都可能是平臺和文件系統不可知的,但如果不能滿足不同平臺的特定策略可能會失敗。

我已經考慮過幾秒鐘分隔兩個目錄列表,並比較文件大小,但是這引入了一個時間/可靠性權衡,我的上司不滿意,除非沒有其他選擇。

爲背景,應用程序被寫成一組Matlab的M文件,所以沒有JRE/CLR招數恐怕......


編輯:文件在到達通過直接移動/複製操作直接輸入,無論是從網絡驅動器還是從本地文件系統的其他位置。這種複製操作可能會由用戶而不是其他應用程序啓動。

結果,這是相當困難的放置在文件提供添加控制文件或使用一箇中間臨時區域任何責任......


結論:好像有沒有簡單的方法要做到這一點,所以我已經解決了皮帶和括號的方式 - 一個文件已準備好處理,如果:

  • 它的大小並不在一定時間內改變,
  • 可以在只讀模式下打開文件(某些複製進程會對文件進行鎖定)。

感謝大家的迴應!

回答

3

這是一個和山丘一樣古老的中間件問題,簡短的回答是:不。

這兩個'解決方案'把責任放在文件上傳器上:(1)將文件上傳到臨時目錄中,然後將其移動到目標目錄中(2)上傳文件,然後創建/上傳'就緒「文件,指示內容文件的狀態。

第一個更好,但都不雅。事實是,存在比文件系統更好的通信媒體。考慮使用一些只涉及push或pull(而不是文件系統)的IPC,如HTTP POST,JMS或MSMQ隊列等。此外,這也可以是同步的,允許進程接收文件承認內容,甚至檢查它的價值,並將客戶的收據交給客戶 - 這是通向不可否認的正確道路。按照這一點,你永遠不會因文件是否傳遞到服務器進行處理而遭受爭議。

M.

+1

在我最初的帖子後的近一年,我越來越接近寫一篇題爲「FTP認爲有害」的論文。我在許多所謂的「企業」商店中看到「通過FTP傳輸大文件」的反模式,這讓我非常震驚。我確信它回到了通過在機器之間攜帶磁帶來實現應用程序之間的通信的時代 - 而且還沒有人對「我們一直這樣做」的呼聲提出質疑。 – 2010-09-29 12:56:07

7

最安全的方法是讓文件放入目錄中的應用程序首先將它們放在不同的臨時目錄中,然後將它們移動到真實的目錄(即使使用FTP時也應該是原子操作或文件共享)。您也可以使用命名約定在一個目錄中實現相同的結果。

編輯: 它確實取決於文件系統,它的複製功能是否具有「完成文件」的概念。我不太瞭解SMB協議,但是如果它有這個概念,你可以編寫一個暴露SMB接口(或補丁Samba)的應用程序和一個API來獲得已完成文件副本的通知。雖然可能很多工作。

1

一個簡單的可能性是在相當大的時間間隔(2到5分鐘)內進行輪詢,並且只有在您第二次看到它時才確認新文件。

我不知道在任何操作系統中的方式來確定文件是否仍在複製,除了可能檢查文件是否被鎖定。

1

文件如何到達那裏?您可以在寫入時在它們上設置屬性,然後在寫入完成後更改屬性?這需要通過寫作來完成......聽起來這不是一個選項。

否則,緩存列表並將文件視爲新的文件,如果它具有相同的文件大小爲兩個連續列表是我能想到的最佳方式。

或者,您可以在文件上使用修改的時間 - 文件必須是新的,並且修改時間至少爲x。但我認爲這將相當於緩存列表。

它你每隔幾秒輪詢文件夾,它的時間損失是不是很大?其平臺不可知論。只有

此外,Linux的:http://www.linux.com/feature/144666

比如cron但文件。不知道它如何處理您的具體問題 - 但可能有用?

0

什麼是您的操作系統。在unix中,您可以使用「lsof」實用程序來確定用戶是否已打開文件以進行寫入。顯然在MS Windows Process Explorer中有一個相同的功能。

另外,您可以嘗試獨家打開文件並退出此失敗。但這可能會有點不可靠,並且很容易踩在自己的腳趾上。