2016-02-04 44 views
2

我有一個輪詢器每35秒在一個特定的目錄上運行。這些文件通過SFTP服務器放置在此目錄中。問題是輪詢與文件被複制的時間衝突。它挑選尚未完全複製的不完整文件。Java:檢查一個文件是否已經使用SFTP完全複製

我們知道文件的狀態是處於複製模式還是複製模式?

+1

這通常所做的一個爲每個實際文件使用'.done'擴展名左右的臨時標誌文件。如果此標誌文件丟失,則文件未完全複製。 –

回答

1

具有輪詢筆記文件大小。如果大小從一輪到下一輪都沒有變化,則文件完成下載。

您可以影響SFTP服務器嗎?可以在下載完成後創建標記文件嗎(例如'.thisIsAFile.doc.done')?

+0

在某些環境中,由於網絡滯後,SFTP傳輸可能會暫時減慢,因此即使等待間隔結束後,文件大小仍然保持不變。這發生在我的環境中。 –

2

有文件觀察家幾種常見的策略,以「知道」的文件被完全轉移

與時間間隔
  1. 投票,並把該文件,如果文件大小不是一個區間內改變到完全轉移。例如每隔1分鐘觀察文件是否存在。一旦你看到文件存在,每5秒監視一次它的大小。如果文件大小保持30秒不變,則將其視爲完全傳輸。

  2. 傳輸過程是否在文件傳輸後創建標記文件。例如完成傳輸文件FOO.txt後,創建一個空的FOO.txt.tag。您的文件守望者是要檢查的FOO.txt.tag存在,一旦它的存在,你知道FOO.txt已經完全轉移

  3. 在某些特殊情況下,該文件是有特殊的格式(例如特殊的頁腳行),那麼你的文件守望者可以輪詢該文件並看到最後行,看他們是否具有期望的圖案

每種方法都有其優點和缺點匹配:

  1. 方法1影響轉印過程最少。有時文件由第三方傳輸,您幾乎無法告訴他們如方法2中創建標記文件。但您可以告訴此方法不是100%可靠的,尤其是在網絡不良的情況下。
  2. 方法2是最可靠的。然而,正如前面所說的,還有你對傳輸過程中沒有控制的情況下
  3. 方法3只適用於特殊情況下

選擇適合您的需要

相關問題