2012-12-03 50 views
1

我們在這裏有一個Windows服務器,有一天我們將通過sftp獲取文件夾中的一些文本文件。我沒有更多的信息,但也許這就夠了。現在我應該編寫一個將這些文件移動到另一個文件夾的函數。那麼不應該那麼難,我想......但現在我意識到我能夠在文件完成之前移動一個文件。所以我正在尋找一些解決方案,我真的很困惑。檢查sftp文件傳輸是否完成?

我的解決方案是檢查文件及其周圍的進程。因爲如果文件還沒有完成,就有一個複製過程,我可以檢查這個過程。爲了簡單起見,我只需要嘗試鎖定文件,如果沒有其他進程,那麼文件已準備好移動?

using (File.Open("myFile", FileMode.Open, FileAccess.Read, FileShare.None)) 
{ /*rdy!*/ } 

但現在我看到人們正在寫一些關於校驗和測試或測試文件大小,如果文件大小不隨後更改文件已準備就緒。這東西不是有點複雜嗎?請告訴我,我的解決方案也可以工作......我無法用任何服務器測試它到服務器sftp的東西。我只知道,如果我將文件複製到另一個文件夾(通過資源管理器),這是工作。這是否也可以通過sftp傳輸工作?有任何想法嗎?謝謝

回答

2

文件大小檢查是危險的 - 如果上傳被暫停並稍後恢復,該怎麼辦?在接受當前文件大小作爲最終文件大小之前,需要多長時間? =>不是一個好的解決方案。

我會去鎖定,但是,這隻適用於寫入文件的進程打開文件的方式,以便它被鎖定。如果這個過程沒有這樣做,你會再次陷入困境。

另一種解決方案是上傳帶有臨時名稱的文件,如「.sftptmp」。上傳者在完成後重命名它。這樣您就可以確定文件已經上傳 - 只需忽略所有以「.sftptmp」結尾的文件。但是,這是假設您實際上可以控制上傳文件的過程。

+0

嗨,謝謝。 「這隻有在寫入文件的過程也以某種方式打開文件以使其被鎖定時纔有效」 - 這是一個sftp選項,還是某個進程以某種方式打開/打開文件? – sabisabi

+0

在SFTP協議中沒有這樣的選項。它取決於您用作服務器的應用程序以及開發人員如何實現文件打開部分。 –