VB.NET中監看資料夾的變化

來源:互聯網
上載者:User

摘要 :

       有時候,處於業務的需要,我們要不斷的監視檔案的變化,比如檔案的建立、刪除、重新命名等;而且某些人要確保重要檔案的唯讀,並且要及時的報告檔案版本的變更情況。或者,你想監視你的檔案夾被別人更改、肆意刪除而又不知道是誰乾的,在什麼時候乾的?於是你就考慮要寫一個監視程式,“偷偷的”記錄檔案夾被操作的情況。

       有些人採取常規的方式,即寫一個傳統型應用程式,其介面可能是隱藏的。採用每隔一個事件片段讀取檔案資訊,然後寫到一個log檔案中。然後設定系統啟動的事件自動載入程式,(好像很多人是這樣竊取QQ密碼的:()。其缺點:1、不是連續的擷取資訊,因為他們採用了Timer的tick事件;2、在NT系統中,可能要一定的許可權才可以運行,比如要管理員身份等。還有系統中會有進程顯示,顯然很容易shutdown.

       我們建議的方案:採用.NET的Windows Service。首先可以克服以上缺點,而且較VB6的編程而言,.NET中寫windows service一如反掌。

思路:

       在.NET建立的服務中調用System.IO.FileSystemWatcher對象,每次被監視的檔案或者檔案夾變化的時候,調用IO系統的FileStream和StreamWriter把變更資訊寫到log檔案中。

本文:

       關於.NET中的Windows服務:

       Windows服務,是一些長久啟動並執行程式,而並不需要依靠登入使用者或客戶程式來保持它的運行。它們沒有自己的使用者介面,可以在它們自己專屬的安全層級和會話上下文中運行。我們比較熟悉的Windows服務範例包含了從列印集區到SQL伺服器以及它的分散式交易協作(DTC)。服務只可以運行在NT、2000以及後繼產品比如XP下運行,它們通過Microsoft Management Console (MMC)提供了一個專門的管理介面(開始->運行->Services.msc)。

       在.NET中建立項目的時候,有一個Windows服務的模板,選擇建立。這個操作自動為我建立了一個新的類,它是繼承了.NET內建了System.ServiceProcess.ServiceBase類。同時它提供給我一個可視化的設計器,一個圖形化的快速開發工具,它特別的為那些本身沒有使用者介面的工程。我可以點擊這個設計器,設定我的服務的名字(我命名為"File Watching")。

       當啟動某項服務時,系統將定位相應的可執行檔,並運行該服務的 OnStart 方法(它包含在可執行檔內)。但是,運行服務與運行可執行檔並不相同。可執行檔僅載入服務。服務則通過“服務控制管理員”訪問(例如啟動和停止)。

       當首次在服務上調用“開始”時,可執行檔將調用 ServiceBase 衍生類別的建構函式。在建構函式執行之後將立即調用 OnStart 命令處理方法。在服務首次載入之後,建構函式不會再次執行,因此有必要將建構函式執行的處理和 OnStart 執行的處理分開。可以由 OnStop 釋放的任何資源都應在 OnStart 中建立。如果服務在 OnStop 釋放資源後再次啟動,那麼,在建構函式中建立資源會妨礙這些資源的正確建立。

       “服務控制管理員”(SCM) 提供與服務互動的方式。可以使用 SCM 將“開始”(Start)、“停止”(Stop)、“暫停”(Pause)、“繼續”(Continue) 或自訂命令傳遞到服務中。SCM 使用 CanStop 和 CanPauseAndContinue 的值,決定服務是否接受“停止”、“暫停”或“繼續”命令。僅當服務類中相應的屬性 CanStop 或 CanPauseAndContinue 為 true 時,才會在 SCM 的操作功能表中啟用“停止”、“暫停”或“繼續”。如果已啟用,則相應的命令將傳遞到服務,並且調用 OnStop、OnPause 或 OnContinue。如果 CanStop、CanShutdown 或 CanPauseAndContinue 為 false,則即使已實現相應的命令處理方法(如 OnStop),也不會予以處理。

       上面是建立任何一個服務,我們都會涉及到的只是,具體在監看資料夾變化的時候,我們用到了FileSystemWatcher。

關於FileSystemWatcher:

       偵聽檔案系統更改通知,並在目錄或目錄中的檔案發生更改時引發事件。

       使用 FileSystemWatcher 監視指定目錄中的更改。可監視指定目錄中的檔案或子目錄的更改。該組件可以監視本機電腦、網路磁碟機或遠端電腦上的檔案。(當然唯讀媒體介質比如cd和dvd,它們檔案的屬性不會改變,所以也就不能觸發事件)

       若要監視所有檔案中的更改,請將 Filter 屬性設定為空白字串 ("")。若要監視特定的檔案,請將 Filter 屬性設定為該檔案名稱。例如,若要監視檔案 MyDoc.txt 中的更改,請將 Filter 屬性設定為“MyDoc.txt”。也可以監視特定類型檔案中的更改。例如,若要監視文字檔中的更改,請將 Filter 屬性設定為“*.txt”。

       可監視目錄或檔案中的若干種更改。例如,可監視檔案或目錄的 Attributes、LastWrite 日期和時間或 Size 方面的更改。通過將 FileSystemWatcher.NotifyFilter 屬性設定為 NotifyFilters 值之一來達到此目的。

       可監視檔案或目錄的重新命名、刪除或建立。例如,若要監視文字檔的重新命名,請將 Filter 屬性設定為“*.txt”,並調用 WaitForChanged 方法之一,調用時給出 WatcherChangeTypes 值的 Renamed。

Demo:

       建立一個project,選擇windows 服務類型,命名為WinServiceFileWatching,我們看到project的引用中自動添加了System.ServiceProcess名空間(這就是建立一個服務的函數集)。從工具中的組件中選擇FileSystemWatcher1,拖放到service1的設計模式上,然後設定如下屬性:

       Filter 擷取或設定篩選字串,用於確定在目錄中監視哪些檔案。 我們設定為*.*,即所有檔案

       IncludeSubdirectories 擷取或設定一個值,該值指示是否監視指定路徑中的子目錄。 設定為true

       Path 擷取或設定要監視的目錄的路徑             設定為我們要監視的對象,比如C:\DonnetData

       然後添加以下代碼:

Protected Overrides Sub OnStart(ByVal args() As String)

        ' 在此處添加啟動服務的代碼。此方法應設定具體的操作

        ' 以便服務可以執行它的工作。

        FileSystemWatcher1.EnableRaisingEvents = True

       ' 我們也可以根據輸入的參數args動態設定要監視的對象

       'FileSystemWatcher1.path= args(0)

End Sub

' 建立檔案(夾)時候觸發,記錄建立資訊到e:\log.txt中

Private Sub FileSystemWatcher1_Created(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Created

        Dim fs As New FileStream("e:\log.txt", FileMode.Append)

        Dim sw As New StreamWriter(fs)

        sw.WriteLine(Now() & Microsoft.VisualBasic.vbTab & "建立" & e.FullPath)

        sw.Close()

        fs.Close()

End Sub

' Rename檔案(夾)時候觸發,記錄建立資訊到e:\log.txt中

Private Sub FileSystemWatcher1_Renamed(ByVal sender As Object, ByVal e As System.IO.RenamedEventArgs) Handles FileSystemWatcher1.Renamed

        Dim fs As New FileStream("e:\log.txt", FileMode.Append)

        Dim sw As New StreamWriter(fs)

        sw.WriteLine(Now() & Microsoft.VisualBasic.vbTab & "重新命名" & e.OldFullPath & "-" & e.FullPath)

        sw.Close()

        fs.Close()

End Sub

' 刪除檔案(夾)時候觸發,記錄建立資訊到e:\log.txt中

Private Sub FileSystemWatcher1_Deleted(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Deleted

        Dim fs As New FileStream("e:\log.txt", FileMode.Append)

        Dim sw As New StreamWriter(fs)

        sw.WriteLine(Now() & Microsoft.VisualBasic.vbTab & "刪除" & e.FullPath)

        sw.Close()

        fs.Close()

End Sub  

到目前為止,這個服務已經寫好了,下面作一個安裝程式:

       在service的設計模式上點擊右鍵,選擇添加安裝程式。系統會自動添加一個類ProjectInstaller,設計模式上有一個ServiceProcessInstaller1 和ServiceInstaller1。設定ServiceInstaller1的Display Name為File Watching Service,starttype為Automatic,表示自動啟動。設定ServiceProcessInstaller1 的account為LocalSystem。

由於服務是不能啟動並執行,我們選擇產生解決方案。ok!

最後安裝我們的服務:

       .NET Framework內建了一個工具,InstallUtil,使用很簡單InstallUtil c:\winservicefilewatching\bin\winservicefilewatching.exe ' 剛才編譯好的程式的路徑

       這樣就安裝好了,Uninstall也很容易。首先SCM中關閉服務,InstallUtil/u c:\...\winservicefilewatching.exe 'the same path

這樣在系統的services中就會多出一個服務,顯示為File Watching Service,選擇啟動就可以開始監視...

       總結:

       在.NET建立的服務中調用System.IO.FileSystemWatcher對象,每次被監視的檔案或者檔案夾變化的時候,調用IO系統的FileStream和StreamWriter把變更資訊寫到log檔案中。實際上利用了.NET強大的內建整合功能,把複雜的檔案簡單話。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。