VB.NET中監視資料夾的變化 (轉)
中監視夾的變化
Montaque
摘要 :
有時候,處於業務的需要,我們要不斷的監視檔案的變化,比如檔案的建立、刪除、重新命名等;而且某些人要確保重要檔案的只讀,並且要及時的報告檔案版本的變更情況。或者,你想監視你的資料夾被別人更改、肆意刪除而又不知道是誰幹的,在什麼時候乾的?於是你就考慮要寫一個監視,“偷偷的”記錄資料夾被操作的情況。
有些人採取常規的方式,即寫一個桌面應用程式,其介面可能是隱藏的。採用每隔一個事件片段讀取檔案資訊,然後寫到一個log檔案中。然後設定啟動的事件自動載入程式,(好像很多人是這樣竊取qq密碼的:()。其缺點:1、不是連續的獲取資訊,因為他們採用了Timer的tick事件;2、在NT系統中,可能要一定的才可以執行,比如要管理員身份等。還有系統中會有程式顯示,顯然很容易shutdown.
我們建議的方案:採用.NET的 Service。首先可以克服以上缺點,而且較的而言,.NET中寫windows service一如反掌。
:namespace prefix = o ns = "urn:schemas--com::office" />
思路:
在.NET建立的服務中System.IO.FileSystemWatcher,每次被監視的檔案或者資料夾變化的時候,呼叫IO系統的FileStream和StreamWriter把變更資訊寫到log檔案中。
正文:
關於.NET中的Windows服務:
Windows服務,是一些長久執行的程式,而並不需要依靠登入或客戶程式來保持它的執行。它們沒有自己的使用者介面,可以在它們自己獨有的級別和會話上下文中執行。我們比較熟悉的Windows服務範例包含了從列印池到以及它的分散式事務協作(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和,它們檔案的屬性不會改變,所以也就不能觸發事件)
若要監視所有檔案中的更改,請將 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 Overrs 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 , 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!
最後安裝我們的服務:
自帶了一個工具,InstallUtil,使用很簡單InstallUtil c:winservicefilewatchingbinwinservicefilewatching.exe ' 剛才編譯好的程式的路徑
這樣就安裝好了,Uninstall也很容易。首先SCM中關閉服務,InstallUtil/u c:...winservicefilewatching.exe 'the same path
這樣在系統的services中就會多出一個服務,顯示為File Watching Service,選擇啟動就可以開始監視...
總結:
在.NET建立的服務中呼叫System.IO.FileSystemWatcher物件,每次被監視的檔案或者資料夾變化的時候,呼叫IO系統的FileStream和StreamWriter把變更資訊寫到log檔案中。實際上利用了.NET強大的內建整合功能,把複雜的檔案簡單話。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-990787/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- vue中如何監聽vuex中的資料變化Vue
- 如何在元件中監聽Vuex的資料變化元件Vue
- 使用C#如何監控選定資料夾中檔案的變動情況?C#
- TF卡資料夾右擊檢視屬性時它說“資料夾變檔案”
- Canal-監聽資料庫表的變化資料庫
- 視覺化中的資料視覺化
- 資料夾變exe資料找回方法
- GO實現資料夾監控Go
- win10如何改變資料夾下所有視訊的播放方式Win10
- Win10系統中此電腦的普通資料夾變成音樂資料夾的解決方法Win10
- Windows中的特殊資料夾Windows
- 資料抽取中的CDC(變化資料捕獲)方式
- 新的Lakehouse,遲來的資料正規化轉變
- Android中asset資料夾和raw資料夾區別Android
- SQL Server CDC配合Kafka Connect監聽資料變化SQLServerKafka
- linux監控資料夾內的檔案數量Linux
- React和Vue中,是如何監聽變數變化的ReactVue變數
- 蘋果|技巧:macOS在Finder中檢視資料夾大小?蘋果Mac
- 精讀《如何利用 Nodejs 監聽資料夾》NodeJS
- 把多個資料夾中的檔案批量放到一個資料夾
- (在模仿中精進資料視覺化03)OD資料的特殊視覺化方式視覺化
- Flutter中的資料視覺化charts家族Flutter視覺化
- Oracle9i如何監視索引並清除監視資訊(轉)Oracle索引
- 【轉】[C#] 重新命名資料夾C#
- 如何在 Mac 上更改資料夾顏色,改變 mac 資料夾顏色教程Mac
- vue 動態監聽視窗大小變化事件Vue事件
- windows 資料夾檢視全域性生效Windows
- WPF 實現檔案/資料夾監聽工具
- win10怎麼檢視隱藏資料夾 window10隱藏資料夾如何檢視Win10
- mac檢視隱藏資料夾的圖文教程Mac
- .gitignore 在已忽略資料夾中不忽略指定檔案、資料夾...Git
- Origin2024中如何新增誤差帶?直觀檢視資料的變化範圍
- 如何監聽URL的變化?
- win10系統資料夾變成英文怎麼辦 win10資料夾變成英文恢復方法Win10
- AndroidStudio資料夾結構檢視講解Android
- Untiy 中的幾個資料夾的介紹
- 百度網盤資料夾大小怎麼檢視?百度網盤檢視某個資料夾大小的技巧
- 6個技巧輕鬆玩轉資料視覺化視覺化
- 個性化資料夾圖示(VB)