以記事本為例
成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)與策劃設(shè)計(jì),金門網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:金門等地區(qū)。金門做網(wǎng)站價格咨詢:028-86922220
Public Class Form1
Public Sub ShellAndWait(ByVal ProcessPath As String)
Dim objProcess As System.Diagnostics.Process
Try
objProcess = New System.Diagnostics.Process()
objProcess.StartInfo.FileName = ProcessPath
objProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal
objProcess.Start()
objProcess.WaitForExit()
objProcess.Close()
Catch
MessageBox.Show("無法執(zhí)行文件 " ProcessPath, "錯誤")
End Try
End Sub
'監(jiān)視程序悄好攔就可以了,若果監(jiān)視別的窗體的話,用SPY++ 找到句柄,配合FindWindowEx,SendMessage根啟胡據(jù)其屬性做
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ShellAndWait("Notepad.exe")
MessageBox.Show("筆記本被關(guān)襪液閉后我才會出現(xiàn)")
End Sub
End Class
有時候 處于業(yè)務(wù)的需要 我們要不斷的監(jiān)視文件的變化 比如文件的創(chuàng)建 刪除 重命名等 而且某些人要確保重要文件的只讀 并且要及時的報(bào)告文件版本的變更情況 或者 你想監(jiān)視你的文件夾被別人更改 肆意刪除而又不知道是誰干的 在什么時候干的?于是你就考慮要寫一個監(jiān)視程序 偷偷的 記錄文件夾 *** 作的情況
有些人采取常規(guī)的方式 即寫一個桌面應(yīng)用程序 其界面可能是隱藏的 采用每隔一個事件片段讀取文件信息 然后寫到一個log文件中 然后設(shè)置系統(tǒng)啟動的事件自動加載程序 (好像很多人是這樣竊取QQ密碼的 ) 其埋早嫌缺點(diǎn) 不是連續(xù)的獲取信息 因?yàn)樗麖澥謧儾捎昧薚imer的tick事件 在NT系統(tǒng)中 可能要一定的權(quán)限才可以運(yùn)行 比如要管理員身份等 還有系統(tǒng)中會有進(jìn)程顯示 顯然很容易shut down
我們建議的方案 采用 NET的Windows Service 首先可以克服以上缺點(diǎn) 而且較VB 的編程而言 NET中寫windows service一如反掌
思路 在 NET創(chuàng)建的服務(wù)中調(diào)用System IO FileSystemWatcher對象 每次被監(jiān)視的文件或者文件夾變化的時候 調(diào)用IO系統(tǒng)的FileStream和StreamWriter把變更信息寫到log文件中
關(guān)于 NET中的Windows服務(wù)
Windows服務(wù) 是一些長久運(yùn)行的程序 而并不需要依靠登錄用戶或客戶程序來保持它的運(yùn)行 它們沒有自己的用戶界面 可以在它們自己獨(dú)有的安全級別和會話上下文中運(yùn)行 我們比較熟悉的Windows服務(wù)范例包含了從打印池到SQL服務(wù)器以及它的分布式事務(wù)協(xié)作(DTC) 服務(wù)只可以運(yùn)行在NT 以及后繼產(chǎn)品比如XP下運(yùn)行 它們通過Microsoft Management Console (MMC)提供了一個專門的管理界面(開始-運(yùn)行 Services msc)
在 NET中創(chuàng)建項(xiàng)目的時候 有一個Windows服務(wù)的模板 選擇新建 這個操作自動為我建立了一個新的類 它是繼承了 NET內(nèi)建了System ServiceProcess ServiceBase類 同時它提供給我一個可視化的設(shè)計(jì)器 一個圖形化的快速開發(fā)工具 它特別的為那些本身沒有用戶界面的工程 我可以點(diǎn)擊這個設(shè)計(jì)器 設(shè)定我的服務(wù)的名字(我命名為 File Watching )
當(dāng)啟動某項(xiàng)服務(wù)時 系統(tǒng)將定位相應(yīng)的可執(zhí)行文件 并運(yùn)行該服務(wù)的 OnStart 方法(它包含在可執(zhí)行文件內(nèi)) 但是 運(yùn)行服務(wù)與運(yùn)行可執(zhí)行文件并不相同 可執(zhí)行文件僅加載服務(wù) 服務(wù)則通過 服務(wù)控制管理器 訪問(例如啟動和停止)
當(dāng)首次在服務(wù)上調(diào)用 開始 時 可執(zhí)行文件將調(diào)用 ServiceBase 派生類的構(gòu)造函數(shù) 在構(gòu)造函數(shù)執(zhí)行之后將立即調(diào)用 OnStart 命令處理方法 在服務(wù)首次加載之后 構(gòu)造函數(shù)不會再次執(zhí)行 因此有必要將構(gòu)造函數(shù)執(zhí)行的處理和 OnStart 執(zhí)行的處理分開 可以由 OnStop 釋放的任何資源都應(yīng)在 OnStart 中創(chuàng)建 如果服務(wù)在 OnStop 釋放資源后再次啟動 那么 在構(gòu)造函數(shù)中創(chuàng)建資源會妨礙這些資源的正確創(chuàng)建
服務(wù)控制管理器 (SCM) 提供與服務(wù)交互的方式 可以使用 SCM 將 開始 (Start) 停止 (Stop) 暫停 (Pause) 繼續(xù) (Continue) 或自定義命令傳遞到服務(wù)中 SCM 使用 CanStop 和 CanPauseAndContinue 的值 決定服務(wù)是否接受 停止 暫停 或 繼續(xù) 命令 僅當(dāng)服務(wù)類中相應(yīng)的屬性 CanStop 或 CanPauseAndContinue 為 true 時 才會在 SCM 的上下文菜單中啟用 停止 暫停 或 繼續(xù) 如果已啟用 則相應(yīng)的命令將傳遞到服務(wù) 并且調(diào)用 OnStop OnPause 或 OnContinue 如果 CanStop CanShutdown 或 CanPauseAndContinue 為 false 則即使已實(shí)現(xiàn)相應(yīng)的命令處理方法(如 OnStop) 也不會予以處理
上面是創(chuàng)建任何一個服務(wù) 我們都會涉及到的 只是 具體在監(jiān)視文件夾變睜稿化的時候 我們用到了FileSystemWatcher
關(guān)于FileSystemWatcher
偵聽文件系統(tǒng)更改通知 并在目錄或目錄中的文件發(fā)生更改時引發(fā)事件
使用 FileSystemWatcher 監(jiān)視指定目錄中的更改 可監(jiān)視指定目錄中的文件或子目錄的更改 該組件可以監(jiān)視本地計(jì)算機(jī) 網(wǎng)絡(luò)驅(qū)動器或遠(yuǎn)程計(jì)算機(jī)上的文件 (當(dāng)然只讀的媒體介質(zhì)比如cd和dvd 它們文件的屬性不會改變 所以也就不能觸發(fā)事件)
若要監(jiān)視所有文件中的更改 請將 Filter 屬性設(shè)置為空字符串 ( ) 若要監(jiān)視特定的文件 請將 Filter 屬性設(shè)置為該文件名 例如 若要監(jiān)視文件 MyDoc txt 中的更改 請將 Filter 屬性設(shè)置為 MyDoc txt 也可以監(jiān)視特定類型文件中的更改 例如 若要監(jiān)視文本文件中的更改 請將 Filter 屬性設(shè)置為 * txt
可監(jiān)視目錄或文件中的若干種更改 例如 可監(jiān)視文件或目錄的 Attributes LastWrite 日期和時間或 Size 方面的更改 通過將 FileSystemWatcher NotifyFilter 屬性設(shè)置為 NotifyFilters 值之一來達(dá)到此目的
可監(jiān)視文件或目錄的重命名 刪除或創(chuàng)建 例如 若要監(jiān)視文本文件的重命名 請將 Filter 屬性設(shè)置為 * txt 并調(diào)用 WaitForChanged 方法之一 調(diào)用時給出 WatcherChangeTypes 值的 Renamed
Demo
新建一個project 選擇windows 服務(wù)類型 命名為WinServiceFileWatching 我們看到project的引用中自動添加了System ServiceProcess名空間(這就是創(chuàng)建一個服務(wù)的函數(shù)集) 從工具中的組件中選擇FileSystemWatcher 拖放到service 的設(shè)計(jì)模式上 然后設(shè)置如下屬性
Filter 獲取或設(shè)置篩選字符串 用于確定在目錄中監(jiān)視哪些文件 我們設(shè)置為* * 即所有文件 IncludeSubdirectories 獲取或設(shè)置一個值 該值指示是否監(jiān)視指定路徑中的子目錄 設(shè)置為true Path 獲取或設(shè)置要監(jiān)視的目錄的路徑 設(shè)置為我們要監(jiān)視的對象 比如C:\DonnetData
然后添加以下代碼
Protected Overrides Sub OnStart(ByVal args() As String)
在此處添加啟動服務(wù)的代碼 此方法應(yīng)設(shè)置具體的操作
以便服務(wù)可以執(zhí)行它的工作
FileSystemWatcher EnableRaisingEvents = True
我們也可以根據(jù)輸入的參數(shù)args動態(tài)設(shè)定要監(jiān)視的對象
FileSystemWatcher path= args( )
End Sub
創(chuàng)建文件(夾)時候觸發(fā) 記錄創(chuàng)建信息到e:\log txt中
Private Sub FileSystemWatcher _Created(ByVal sender As Object ByVal e As System IO FileSystemEventArgs) Handles FileSystemWatcher Created
Dim fs As New FileStream( e:\log txt FileMode Append)
Dim sw As New StreamWriter(fs)
sw WriteLine(Now() Microsoft VisualBasic vbTab 創(chuàng)建 e FullPath)
sw Close()
fs Close()
End Sub
Rename文件(夾)時候觸發(fā) 記錄創(chuàng)建信息到e:\log txt中
Private Sub FileSystemWatcher _Renamed(ByVal sender As Object ByVal e As System IO RenamedEventArgs) Handles FileSystemWatcher 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
刪除文件(夾)時候觸發(fā) 記錄創(chuàng)建信息到e:\log txt中
Private Sub FileSystemWatcher _Deleted(ByVal sender As Object ByVal e As System IO FileSystemEventArgs) Handles FileSystemWatcher 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
到目前為止 這個服務(wù)已經(jīng)寫好了 下面作一個安裝程序
在service的設(shè)計(jì)模式上點(diǎn)擊右鍵 選擇添加安裝程序 系統(tǒng)會自動添加一個類ProjectInstaller 設(shè)計(jì)模式上有一個ServiceProcessInstaller 和ServiceInstaller 設(shè)置ServiceInstaller 的Display Name為File Watching Service starttype為Automatic 表示自動啟動 設(shè)置ServiceProcessInstaller 的account為LocalSystem
由于服務(wù)是不能運(yùn)行的 我們選擇生成解決方案 ok!
最后安裝我們的服務(wù)
NET Framework自帶了一個工具 InstallUtil 使用很簡單InstallUtil c:\winservicefilewatching\bin\winservicefilewatching exe 剛才編譯好的程序的路徑 這樣就安裝好了 Uninstall也很容易 首先SCM中關(guān)閉服務(wù) InstallUtil/u c:\ \winservicefilewatching exe the same path
這樣在系統(tǒng)的services中就會多出一個服務(wù) 顯示為File Watching Service 選擇啟動就可以開始監(jiān)視
總結(jié)
lishixinzhi/Article/program/net/201311/15520
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
FileSystemWatcher1.NotifyFilter = IO.NotifyFilters.DirectoryName Or IO.NotifyFilters.FileName‘監(jiān)控文件夾和皮察文件蔽握畝。
FileSystemWatcher1.IncludeSubdirectories = True’監(jiān)控子文件夾
End Sub
Private Sub FileSystemWatcher1_Renamed(sender As Object, e As IO.RenamedEventArgs) Handles FileSystemWatcher1.Renamed
MsgBox(e.FullPath vbCrLf e.Name)
End Sub'捕獲新路徑
你監(jiān)控test不就好了,若要排除其他文件夾,IncludeSubdirectories 設(shè)為假,用多個FileSystemWatcher就行了,用數(shù)組或其他方式宏森創(chuàng)建。
你用兩個 FileSystemWatcher,一個監(jiān)控父文件夾,并禁敬臘止其改名,另一個監(jiān)碧消控子文件夾,并改名后提示就亮慧滑是了