2009-02-26 66 views
9

好的,我手上有一個有趣的問題。這裏有一些背景:觀看上傳文件夾的最佳做法?

我正在編寫一個媒體庫服務實現,它將向前端Flash播放器提供URL。客戶希望能夠通過將帶有一些元數據的文件上傳到FTP文件夾中來將內容推送到服務中 - 我已經控制了元數據模式。觀看這個文件夾的服務將拾取任何新文件,將它們複製到「內容」文件夾中,然後將元數據和網址按內容服務中的內容推送到數據庫中。

內容服務不是問題,完成。看一個FTP文件夾是。

我目前的實現使用FileSystemWatcher對象和一個用於xml文件的過濾器。

每個內容項目可能有多個文件,例如高,中,低質量的視頻。

我打算強制按進程或工具將內容組織到自己的文件夾中,只是爲了簡潔起見,但這不是真正的問題。

的XML文件看起來有點像這樣:

<media> 
    <meta type="video"> 
    <name>The Name Displayed</name> 
    <heading>The title of the video</heading> 
    <description> 
     A lengthy description about the video.. 
    </description> 
    <length>00:00:19</length> 
</meta> 
<files> 
    <video file="somevideo.flv" quality="low"/> 
    <video file="somevideo.flv" quality="medium"/> 
    <video file="somevideo.flv" quality="high"/> 
</files> 
</media> 

因此,當一個新的文件中創建FileSystemWatcher.Created事件觸發。我有一個獨立的線程運行來處理與主服務進程共享一個隊列的內容(不要擔心它使用生產者消費者模式,詳細信息如下:http://msdn.microsoft.com/en-us/library/yy12yx1f.aspx)。

這一切都正常,但現在我遇到了左邊和右邊的情況!

我已經考慮到視頻上傳需要更長的時間,因此處理器會嘗試獲得排他鎖定,如果失敗,它會將項目移動到隊列後面並移至下一個項目。

  • 如果服務崩潰或者那裏已經存在文件,會發生什麼?所以我寫了一個方法來排隊現有的文件。
  • 如果在排隊現有文件時文件正在上載,該怎麼辦?希望它能處理這個問題?我應該定期重新掃描目錄,看看我是否錯過了任何東西?

任何人都可以推薦這種情況下的最佳做法嗎?文件系統監視器是一個好主意,還是應該定期掃描文件夾?

編輯:只是想給你一些規模的想法。我們總共談到10個1000個項目。可能上傳大塊。

回答

3

FileSystemWatcher是獲取文件丟失的早期可見性的實用方法,但存在很多可能導致錯過事件的邊緣情況。你仍然需要定期掃描。

爲了避免儘可能多的互斥問題;客戶端可以上傳爲foo.xml.upload,然後重命名爲foo.xml嗎?這將避免冗長的鎖定文件...(你只是忽略了.upload文件)。

另外:要小心「沒有發明在這裏」......有很多現有的實用程序,監控文件夾; BizTalk for(一個矯枉過正)的例子。我不是說「不要自己動手」,而是至少考慮預先選擇的罐裝食品。

+0

我會看看第三方解決方案。我認爲這裏沒有發明可能會涉及它。我已經被推薦使用Fluent Nhibernate,並被命令使用Linq to Sql代替。必須獲得任何第三方的認可 - 需要一個年齡。 – 2009-02-26 10:37:20

+0

@ RobStevenson-Leggett您是否找到第三方解決方案?還是你最終滾動自己的? – phuzi 2015-05-18 19:53:16

0

您可能希望運行一個Web服務,以使上傳者可以在上傳完成時進行ping操作。只是一個網址會很好,就像「http://www.bigtimecompany.com/ftpuploadcomplete.php」一樣,被調用後,會啓動任何程序檢查ftp文件夾。

1

觀看文件時遇到的一個常見錯誤創建是您可以在上傳完成之前收到您的事件,因此您最終會處理一個不完整的文件。

當然,您可以檢查,因爲不完整的文件的xml格式不正確。但更好的解決方案是讓上傳器寫入臨時文件,完成上載後,將文件重命名爲* .xml。

至於FileSystemWatcher本身,以及...當我在使用網絡共享時(delete事件從未被解僱),我開始不信任它。所以我寫了我自己的'觀察者',它與FSW具有類似的接口,但只是輪詢文件創建/刪除/更改的目錄。不如FSW那麼優雅,但更可靠。