2010-10-20 80 views
8

我開始創建一個應用程序,該應用程序將爲所創建的任何文件監視目錄。非常簡單的時間使用文件系統監視器。我的問題涉及如何利用它。通常的做法是使用Windows服務來確保應用程序始終運行?filesystemwatcher as windows service?

我一直在試圖擺脫建設Windows服務,如果我不必,但我真的沒有看到在這種情況下這樣做的替代方案。通常,我會將我的服務轉換爲控制檯應用程序,並使用Windows調度程序安排它,但這並不適用於這種情況。

任何人都可以推薦一個比windows服務更好的實現文件systemwatcher的方法嗎?

感謝您的任何想法。

編輯 響應下面的評論,更具體地講,我只需要觀看一個服務器上的目錄,並創建一個新的文件時,我有該文件的一個副本移動到不同的目錄在同一臺服務器上,也許在這個過程中重命名它。

文件的頻率和數量會很小。一天最多5-10個。

+1

也許以較少的內存佔用語言/運行時實現該服務,並且只有在發現新文件時才運行C#程序。 – CodesInChaos 2010-10-20 18:27:54

+1

@CodeInChaos - 不是一個好主意。實現本地FSW功能要困難得多,以及雙進程解決方案中涉及的複雜性。我認爲我們已經超越了託管代碼的成見? – 2010-10-20 18:32:25

+1

真的,CodeInChaos?我都是爲了提高效率,但我不確定你的評論是否特別有建設性,我當然不希望成爲那些在以後爲項目的不同部分切換語言的人挖掘代碼的人。 (這就是說,我想我們都是這麼做的......) – Brad 2010-10-20 18:35:04

回答

2

你應該更多地描述你想要做什麼,但是通常如果你需要在後臺運行某些東西並且不需要直接用戶交互,那麼服務通常是有意義的。

如果需要,您可以根據需要使用遠程處理將前端連接到您的服務。

+2

非常真實,儘管WCF是比Remoting更好的選擇,在這一點上它已被棄用。 – 2010-10-20 18:27:33

+0

太好了......真的!?哇,我最近投入了大量的時間來搞清Remoting和它的所有廢話。 :-噢,好吧......我想我現在應該去學習WCF。 – Brad 2010-10-20 18:32:44

+0

WCF非常棒,容易拾取。您也可以很容易地使用configs更改功能 – jlafay 2010-10-20 19:21:36

1

是的,使用此類操作的服務,但don'tusefilesystemwatcher。如果您在服務中查詢文件,則也可以使用Timer類別dont use

檢查以確保文件已完成寫入並在嘗試移動之前不再鎖定。

它很容易輪詢文件更改(語法可能關閉),並消除了與文件系統監視器事件相關的大量額外編程。

While True 'or your exit condition' 
Dim _files() as FileInfo = Directory.GetFiles(yourTargetDirectory) 
For Each _file as FileInfo In _files 
    If _file.LastModifiedDate < DateTime.Now.AddMinutes(1) Then 
    'move your files' 
    End If 
Next 

End While 
+0

您推薦作爲filesystemwatcher的替代選項。 – czuroski 2010-10-20 18:35:00

+0

唯一的非輪詢替代方案是'ReadDirectoryChangesW' - 很難得到正確的結果,以及相同的可靠性問題。 – 2010-10-20 18:36:35

+0

到目前爲止,我用這個FileSystemWatcher包裝好運......隱藏了幾個疣。 http://www.codeproject.com/KB/cs/EnhancedFileSysWatcher.aspx – kenny 2010-10-20 18:40:03

0

使用Windows服務包FileSystemWatcher是你所需要的完美的罰款。

FSW是工作的正確工具(文件系統監視的本機代碼是正確的承擔),並且服務是部署它的正確機制,因爲您需要「始終在線」操作。

服務憑證也將與登錄用戶無關,這可能對您有用。

+0

不能不同意關於FSW的更多信息。它在幾種情況下表現出不可靠。把它翻出來,用一個輪詢mechanisim(不是Win32管理的)來代替所有的問題。 – StingyJack 2010-10-20 20:00:56

3

我還不確定文件查看器是如何工作的,但這就是我的想法:文件系統觸發事件;我的意思是像NTFS一定是這樣做的。您的文件觀察者會將這些事件掛鉤。文件觀察者可能暫停它正在運行的線程,直到發生事件並且該事件以某種方式喚醒線程。暫停的線程在暫停時使用幾乎很少的cpu週期(實際上沒有),因此等待文件事件不需要任何費用。因此,一個輪詢方法會浪費很多cpu週期(這是法語,它意味着'狗屎負載'),但文件守護程序不會。你可以看看PerfMon,看看這可能是真的。