2012-03-15 40 views
1

我有一臺即將開始接收文件的服務器。這些文件將被放置在一個文件夾中。我必須一次讀取文件並將數據保存到我的數據庫。我是否可以使用FileSystemWatcher來監視文件夾,然後在觀察者找到新文件時處理這些文件?或者我還應該使用MSMQ,以便在觀察者找到新文件後將這些文件放在隊列中?使用MSMQ有點矯枉過正? MSMQ是一件好事,但只要觀察者一次只處理一個文件,那麼我不太確定它是否真的有必要使用MSMQ。 FileSystemWatcher是否足以確保一次只處理一個文件?如果文件的進程失敗,該文件將仍然在文件夾中,因此不會丟失。 所以基本上我有這兩種模式之間進行選擇:FileSystemWatcher vs. MSMQ。可以選擇什麼?

傳入文件 - >文件被放置在文件夾 - >觀察者看到的文件 - >代碼背後的守望者讀取文件並將其保存到數據庫 - >看守返回到文件夾等待新文件。

傳入文件 - >文件被放置在文件夾 - >觀察者看到該文件 - >觀察者將消息(包含文件路徑)上的隊列中,並返回到觀看文件夾 - >甲QueueWatcher會看到消息,從路徑中讀取文件並將數據保存到數據庫 - > QueueWatcher重新運行以偵聽隊列中的新消息。

+2

除非你需要處理斷開連接的系統我會保持簡單 – StaWho 2012-03-15 09:06:10

+1

'Msmq是一件好事情'在這種情況下,你真正需要的是什麼? – shambulator 2012-03-15 09:09:01

+0

這就是我的問題:)我開始認爲我需要msmq,因爲我被告知我們的服務器需要處理大量包含文件。現在我知道這些文件將被放置在我們的服務器上的一個文件夾中發送給我們。然後我轉向filesystemwatcher,但在作出決定之前,我只是想確保它有足夠的解決方案:) – Christian 2012-03-15 09:15:28

回答

0

嘗試FileSystemWatcher只。如果這不夠,那麼你可以擴展你的解決方案。奧卡姆的剃刀仍然站立。

0

從我的經驗來看,MSMQ比較複雜,很難開發和維護技術,例如用C#編寫的使用FileSystemWatcher的windows服務。

但我更喜歡另一種方式:通過觸摸Web服務來通知文件服務器,通知新文件已到達。

1

有一點需要記住的是,你的系統是否會在短時間內收到大量文件。正如MSDN documentation說:

「如果在很短的時間很多變化,緩衝可能溢出 這將導致組件失去跟蹤變化的目錄, 它只會提供毛毯通知。 。增加 的大小帶有InternalBufferSize屬性的緩衝區很昂貴,因爲它的 來自無法換出到磁盤的非分頁內存,所以 保持緩衝區儘量小而不會丟失任何文件更改 事件「。

所以,如果這將是這種情況,你可能想要使用一種不同的方法,比如說只是輪詢服務並保存處理文件的記錄。

+1

這是一個解決的問題。只要確保你在事件處理程序中不做任何實際的工作。只需將eventargs放入隊列中並讓工作線程完成這項工作即可。 – adrianm 2012-03-15 09:45:02

0

我有一個類似的問題要解決。使用FileSystemWatcher後,我對其進行了更改,以便系統的文件寫入部分通過TCP套接字發送的顯式消息通知另一端新文件已準備就緒。

我不知道你是否可以改變這一方的轉移,所以它可能不是你的問題的解決方案。

相關問題