有時候
處於業務的需要
我們要不斷的監視文件的變化
比如文件的創建
刪除
重命名等
而且某些人要確保重要文件的只讀
並且要及時的報告文件版本的變更情況
或者
你想監視你的文件夾被別人更改
肆意刪除而又不知道是誰干的
在什麼時候干的?於是你就考慮要寫一個監視程序
偷偷的
記錄文件夾被操作的情況
有些人采取常規的方式即寫一個桌面應用程序其界面可能是隱藏的采用每隔一個事件片段讀取文件信息然後寫到一個log文件中然後設置系統啟動的事件自動加載程序(好像很多人是這樣竊取QQ密碼的)其缺點不是連續的獲取信息因為他們采用了Timer的tick事件在NT系統中可能要一定的權限才可以運行比如要管理員身份等還有系統中會有進程顯示顯然很容易shut down
我們建議的方案采用NET的Windows Service首先可以克服以上缺點而且較VB的編程而言NET中寫windows service一如反掌
思路在NET創建的服務中調用SystemIOFileSystemWatcher對象每次被監視的文件或者文件夾變化的時候調用IO系統的FileStream和StreamWriter把變更信息寫到log文件中
關於NET中的Windows服務
Windows服務是一些長久運行的程序而並不需要依靠登錄用戶或客戶程序來保持它的運行它們沒有自己的用戶界面可以在它們自己獨有的安全級別和會話上下文中運行我們比較熟悉的Windows服務范例包含了從打印池到SQL服務器以及它的分布式事務協作(DTC)服務只可以運行在NT以及後繼產品比如XP下運行它們通過Microsoft Management Console (MMC)提供了一個專門的管理界面(開始->運行>Servicesmsc)
在NET中創建項目的時候有一個Windows服務的模板選擇新建這個操作自動為我建立了一個新的類它是繼承了NET內建了SystemServiceProcessServiceBase類同時它提供給我一個可視化的設計器一個圖形化的快速開發工具它特別的為那些本身沒有用戶界面的工程我可以點擊這個設計器設定我的服務的名字(我命名為File Watching)
當啟動某項服務時系統將定位相應的可執行文件並運行該服務的 OnStart 方法(它包含在可執行文件內)但是運行服務與運行可執行文件並不相同可執行文件僅加載服務服務則通過服務控制管理器訪問(例如啟動和停止)
當首次在服務上調用開始時可執行文件將調用 ServiceBase 派生類的構造函數在構造函數執行之後將立即調用 OnStart 命令處理方法在服務首次加載之後構造函數不會再次執行因此有必要將構造函數執行的處理和 OnStart 執行的處理分開可以由 OnStop 釋放的任何資源都應在 OnStart 中創建如果服務在 OnStop 釋放資源後再次啟動那麼在構造函數中創建資源會妨礙這些資源的正確創建
服務控制管理器(SCM) 提供與服務交互的方式可以使用 SCM 將開始(Start)停止(Stop)暫停(Pause)繼續(Continue) 或自定義命令傳遞到服務中SCM 使用 CanStop 和 CanPauseAndContinue 的值決定服務是否接受停止暫停或繼續命令僅當服務類中相應的屬性 CanStop 或 CanPauseAndContinue 為 true 時才會在 SCM 的上下文菜單中啟用停止暫停或繼續如果已啟用則相應的命令將傳遞到服務並且調用 OnStopOnPause 或 OnContinue如果 CanStopCanShutdown 或 CanPauseAndContinue 為 false則即使已實現相應的命令處理方法(如 OnStop)也不會予以處理
上面是創建任何一個服務我們都會涉及到的只是具體在監視文件夾變化的時候我們用到了FileSystemWatcher
關於FileSystemWatcher
偵聽文件系統更改通知並在目錄或目錄中的文件發生更改時引發事件
使用 FileSystemWatcher 監視指定目錄中的更改可監視指定目錄中的文件或子目錄的更改該組件可以監視本地計算機網絡驅動器或遠程計算機上的文件(當然只讀的媒體介質比如cd和dvd它們文件的屬性不會改變所以也就不能觸發事件)
若要監視所有文件中的更改請將 Filter 屬性設置為空字符串 ()若要監視特定的文件請將 Filter 屬性設置為該文件名例如若要監視文件 MyDoctxt 中的更改請將 Filter 屬性設置為MyDoctxt也可以監視特定類型文件中的更改例如若要監視文本文件中的更改請將 Filter 屬性設置為*txt
可監視目錄或文件中的若干種更改例如可監視文件或目錄的 AttributesLastWrite 日期和時間或 Size 方面的更改通過將 FileSystemWatcherNotifyFilter 屬性設置為 NotifyFilters 值之一來達到此目的
可監視文件或目錄的重命名刪除或創建例如若要監視文本文件的重命名請將 Filter 屬性設置為*txt並調用 WaitForChanged 方法之一調用時給出 WatcherChangeTypes 值的 Renamed
Demo
新建一個project選擇windows 服務類型命名為WinServiceFileWatching我們看到project的引用中自動添加了SystemServiceProcess名空間(這就是創建一個服務的函數集)從工具中的組件中選擇FileSystemWatcher拖放到service的設計模式上然後設置如下屬性
Filter
獲取或設置篩選字符串
用於確定在目錄中監視哪些文件
我們設置為*
*
即所有文件
IncludeSubdirectories
獲取或設置一個值
該值指示是否監視指定路徑中的子目錄
設置為true
Path
獲取或設置要監視的目錄的路徑 設置為我們要監視的對象
比如C:\DonnetData
然後添加以下代碼
Protected Overrides Sub OnStart(ByVal args() As String)
在此處添加啟動服務的代碼此方法應設置具體的操作
以便服務可以執行它的工作
FileSystemWatcherEnableRaisingEvents = True
我們也可以根據輸入的參數args動態設定要監視的對象
FileSystemWatcherpath= args()
End Sub
創建文件(夾)時候觸發記錄創建信息到e:\logtxt中
Private Sub FileSystemWatcher_Created(ByVal sender As Object ByVal e As SystemIOFileSystemEventArgs) Handles FileSystemWatcherCreated
Dim fs As New FileStream(e:\logtxt FileModeAppend)
Dim sw As New StreamWriter(fs)
swWriteLine(Now() & MicrosoftVisualBasicvbTab & 創建 & eFullPath)
swClose()
fsClose()
End Sub
Rename文件(夾)時候觸發記錄創建信息到e:\logtxt中
Private Sub FileSystemWatcher_Renamed(ByVal sender As Object ByVal e As SystemIORenamedEventArgs) Handles FileSystemWatcherRenamed
Dim fs As New FileStream(e:\logtxt FileModeAppend)
Dim sw As New StreamWriter(fs)
swWriteLine(Now() & MicrosoftVisualBasicvbTab & 重命名 & eOldFullPath & & eFullPath)
swClose()
fsClose()
End Sub
刪除文件(夾)時候觸發記錄創建信息到e:\logtxt中
Private Sub FileSystemWatcher_Deleted(ByVal sender As Object ByVal e As SystemIOFileSystemEventArgs) Handles FileSystemWatcherDeleted
Dim fs As New FileStream(e:\logtxt FileModeAppend)
Dim sw As New StreamWriter(fs)
swWriteLine(Now() & MicrosoftVisualBasicvbTab & 刪除 & eFullPath)
swClose()
fsClose()
End Sub
到目前為止這個服務已經寫好了下面作一個安裝程序
在service的設計模式上點擊右鍵選擇添加安裝程序系統會自動添加一個類ProjectInstaller設計模式上有一個ServiceProcessInstaller 和ServiceInstaller設置ServiceInstaller的Display Name為File Watching Servicestarttype為Automatic表示自動啟動設置ServiceProcessInstaller 的account為LocalSystem
由於服務是不能運行的我們選擇生成解決方案ok!
最後安裝我們的服務
NET Framework自帶了一個工具InstallUtil使用很簡單InstallUtil c:\winservicefilewatching\bin\winservicefilewatchingexe 剛才編譯好的程序的路徑這樣就安裝好了Uninstall也很容易首先SCM中關閉服務InstallUtil/u c:\\winservicefilewatchingexe the same path
這樣在系統的services中就會多出一個服務顯示為File Watching Service選擇啟動就可以開始監視
總結
在NET創建的服務中調用SystemIOFileSystemWatcher對象每次被監視的文件或者文件夾變化的時候調用IO系統的FileStream和StreamWriter把變更信息寫到log文件中實際上利用了NET強大的內置集成功能把復雜的文件簡單話
From:http://tw.wingwit.com/Article/program/net/201311/15520.html