小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

vb.net中監(jiān)視文件夾的變化 montaque(原作)...

 waywin 2005-07-22

VB.NET中監(jiān)視文件夾的變化 Montaque(原作)
.Net教程-文件IO

VB.NET中監(jiān)視文件夾的變化    Montaque(原作)  
  
摘要 :

       有時(shí)候,處于業(yè)務(wù)的需要,我們要不斷的監(jiān)視文件的變化,比如文件的創(chuàng)建、刪除、重命名等;而且某些人要確保重要文件的只讀,并且要及時(shí)的報(bào)告文件版本的變更情況?;蛘撸阆氡O(jiān)視你的文件夾被別人更改、肆意刪除而又不知道是誰(shuí)干的,在什么時(shí)候干的?于是你就考慮要寫(xiě)一個(gè)監(jiān)視程序,“偷偷的”記錄文件夾被操作的情況。

       有些人采取常規(guī)的方式,即寫(xiě)一個(gè)桌面應(yīng)用程序,其界面可能是隱藏的。采用每隔一個(gè)事件片段讀取文件信息,然后寫(xiě)到一個(gè)log文件中。然后設(shè)置系統(tǒng)啟動(dòng)的事件自動(dòng)加載程序,(好像很多人是這樣竊取QQ密碼的:()。其缺點(diǎn):1、不是連續(xù)的獲取信息,因?yàn)樗麄儾捎昧薚imer的tick事件;2、在NT系統(tǒng)中,可能要一定的權(quán)限才可以運(yùn)行,比如要管理員身份等。還有系統(tǒng)中會(huì)有進(jìn)程顯示,顯然很容易shutdown.

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

思路:

       在.NET創(chuàng)建的服務(wù)中調(diào)用System.IO.FileSystemWatcher對(duì)象,每次被監(jiān)視的文件或者文件夾變化的時(shí)候,調(diào)用IO系統(tǒng)的FileStream和StreamWriter把變更信息寫(xiě)到log文件中。

正文:

       關(guān)于.NET中的Windows服務(wù):

       Windows服務(wù),是一些長(zhǎng)久運(yùn)行的程序,而并不需要依靠登錄用戶或客戶程序來(lái)保持它的運(yùn)行。它們沒(méi)有自己的用戶界面,可以在它們自己獨(dú)有的安全級(jí)別和會(huì)話上下文中運(yùn)行。我們比較熟悉的Windows服務(wù)范例包含了從打印池到SQL服務(wù)器以及它的分布式事務(wù)協(xié)作(DTC)。服務(wù)只可以運(yùn)行在NT、2000以及后繼產(chǎn)品比如XP下運(yùn)行,它們通過(guò)Microsoft Management Console (MMC)提供了一個(gè)專門的管理界面(開(kāi)始->運(yùn)行->Services.msc)。

       在.NET中創(chuàng)建項(xiàng)目的時(shí)候,有一個(gè)Windows服務(wù)的模板,選擇新建。這個(gè)操作自動(dòng)為我建立了一個(gè)新的類,它是繼承了.NET內(nèi)建了System.ServiceProcess.ServiceBase類。同時(shí)它提供給我一個(gè)可視化的設(shè)計(jì)器,一個(gè)圖形化的快速開(kāi)發(fā)工具,它特別的為那些本身沒(méi)有用戶界面的工程。我可以點(diǎn)擊這個(gè)設(shè)計(jì)器,設(shè)定我的服務(wù)的名字(我命名為"File Watching")。

       當(dāng)啟動(dòng)某項(xiàng)服務(wù)時(shí),系統(tǒng)將定位相應(yīng)的可執(zhí)行文件,并運(yùn)行該服務(wù)的 OnStart 方法(它包含在可執(zhí)行文件內(nèi))。但是,運(yùn)行服務(wù)與運(yùn)行可執(zhí)行文件并不相同??蓤?zhí)行文件僅加載服務(wù)。服務(wù)則通過(guò)“服務(wù)控制管理器”訪問(wèn)(例如啟動(dòng)和停止)。

       當(dāng)首次在服務(wù)上調(diào)用“開(kāi)始”時(shí),可執(zhí)行文件將調(diào)用 ServiceBase 派生類的構(gòu)造函數(shù)。在構(gòu)造函數(shù)執(zhí)行之后將立即調(diào)用 OnStart 命令處理方法。在服務(wù)首次加載之后,構(gòu)造函數(shù)不會(huì)再次執(zhí)行,因此有必要將構(gòu)造函數(shù)執(zhí)行的處理和 OnStart 執(zhí)行的處理分開(kāi)??梢杂?OnStop 釋放的任何資源都應(yīng)在 OnStart 中創(chuàng)建。如果服務(wù)在 OnStop 釋放資源后再次啟動(dòng),那么,在構(gòu)造函數(shù)中創(chuàng)建資源會(huì)妨礙這些資源的正確創(chuàng)建。

       “服務(wù)控制管理器”(SCM) 提供與服務(wù)交互的方式??梢允褂?SCM 將“開(kāi)始”(Start)、“停止”(Stop)、“暫停”(Pause)、“繼續(xù)”(Continue) 或自定義命令傳遞到服務(wù)中。SCM 使用 CanStop 和 CanPauseAndContinue 的值,決定服務(wù)是否接受“停止”、“暫停”或“繼續(xù)”命令。僅當(dāng)服務(wù)類中相應(yīng)的屬性 CanStop 或 CanPauseAndContinue 為 true 時(shí),才會(huì)在 SCM 的上下文菜單中啟用“停止”、“暫停”或“繼續(xù)”。如果已啟用,則相應(yīng)的命令將傳遞到服務(wù),并且調(diào)用 OnStop、OnPause 或 OnContinue。如果 CanStop、CanShutdown 或 CanPauseAndContinue 為 false,則即使已實(shí)現(xiàn)相應(yīng)的命令處理方法(如 OnStop),也不會(huì)予以處理。

       上面是創(chuàng)建任何一個(gè)服務(wù),我們都會(huì)涉及到的只是,具體在監(jiān)視文件夾變化的時(shí)候,我們用到了FileSystemWatcher。

關(guān)于FileSystemWatcher:

       偵聽(tīng)文件系統(tǒng)更改通知,并在目錄或目錄中的文件發(fā)生更改時(shí)引發(fā)事件。

       使用 FileSystemWatcher 監(jiān)視指定目錄中的更改??杀O(jiān)視指定目錄中的文件或子目錄的更改。該組件可以監(jiān)視本地計(jì)算機(jī)、網(wǎng)絡(luò)驅(qū)動(dòng)器或遠(yuǎn)程計(jì)算機(jī)上的文件。(當(dāng)然只讀的媒體介質(zhì)比如cd和dvd,它們文件的屬性不會(huì)改變,所以也就不能觸發(fā)事件)

       若要監(jiān)視所有文件中的更改,請(qǐng)將 Filter 屬性設(shè)置為空字符串 ("")。若要監(jiān)視特定的文件,請(qǐng)將 Filter 屬性設(shè)置為該文件名。例如,若要監(jiān)視文件 MyDoc.txt 中的更改,請(qǐng)將 Filter 屬性設(shè)置為“MyDoc.txt”。也可以監(jiān)視特定類型文件中的更改。例如,若要監(jiān)視文本文件中的更改,請(qǐng)將 Filter 屬性設(shè)置為“*.txt”。

       可監(jiān)視目錄或文件中的若干種更改。例如,可監(jiān)視文件或目錄的 Attributes、LastWrite 日期和時(shí)間或 Size 方面的更改。通過(guò)將 FileSystemWatcher.NotifyFilter 屬性設(shè)置為 NotifyFilters 值之一來(lái)達(dá)到此目的。

       可監(jiān)視文件或目錄的重命名、刪除或創(chuàng)建。例如,若要監(jiān)視文本文件的重命名,請(qǐng)將 Filter 屬性設(shè)置為“*.txt”,并調(diào)用 WaitForChanged 方法之一,調(diào)用時(shí)給出 WatcherChangeTypes 值的 Renamed。

Demo:

       新建一個(gè)project,選擇windows 服務(wù)類型,命名為WinServiceFileWatching,我們看到project的引用中自動(dòng)添加了System.ServiceProcess名空間(這就是創(chuàng)建一個(gè)服務(wù)的函數(shù)集)。從工具中的組件中選擇FileSystemWatcher1,拖放到service1的設(shè)計(jì)模式上,然后設(shè)置如下屬性:

       Filter 獲取或設(shè)置篩選字符串,用于確定在目錄中監(jiān)視哪些文件。 我們?cè)O(shè)置為*.*,即所有文件

       IncludeSubdirectories 獲取或設(shè)置一個(gè)值,該值指示是否監(jiān)視指定路徑中的子目錄。 設(shè)置為true

       Path 獲取或設(shè)置要監(jiān)視的目錄的路徑             設(shè)置為我們要監(jiān)視的對(duì)象,比如C:\DonnetData

       然后添加以下代碼:

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

        ‘ 在此處添加啟動(dòng)服務(wù)的代碼。此方法應(yīng)設(shè)置具體的操作

        ‘ 以便服務(wù)可以執(zhí)行它的工作。

        FileSystemWatcher1.EnableRaisingEvents = True

       ‘ 我們也可以根據(jù)輸入的參數(shù)args動(dòng)態(tài)設(shè)定要監(jiān)視的對(duì)象

       ‘FileSystemWatcher1.path= args(0)

End Sub

‘ 創(chuàng)建文件(夾)時(shí)候觸發(fā),記錄創(chuàng)建信息到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 & "創(chuàng)建" & e.FullPath)

        sw.Close()

        fs.Close()

End Sub

‘ Rename文件(夾)時(shí)候觸發(fā),記錄創(chuàng)建信息到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

‘ 刪除文件(夾)時(shí)候觸發(fā),記錄創(chuàng)建信息到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  

到目前為止,這個(gè)服務(wù)已經(jīng)寫(xiě)好了,下面作一個(gè)安裝程序:

       在service的設(shè)計(jì)模式上點(diǎn)擊右鍵,選擇添加安裝程序。系統(tǒng)會(huì)自動(dòng)添加一個(gè)類ProjectInstaller,設(shè)計(jì)模式上有一個(gè)ServiceProcessInstaller1 和ServiceInstaller1。設(shè)置ServiceInstaller1的Display Name為File Watching Service,starttype為Automatic,表示自動(dòng)啟動(dòng)。設(shè)置ServiceProcessInstaller1 的account為L(zhǎng)ocalSystem。

由于服務(wù)是不能運(yùn)行的,我們選擇生成解決方案。ok!

最后安裝我們的服務(wù):

       .NET Framework自帶了一個(gè)工具,InstallUtil,使用很簡(jiǎn)單InstallUtil c:\winservicefilewatching\bin\winservicefilewatching.exe ‘ 剛才編譯好的程序的路徑

       這樣就安裝好了,Uninstall也很容易。首先SCM中關(guān)閉服務(wù),InstallUtil/u c:\...\winservicefilewatching.exe ‘the same path

這樣在系統(tǒng)的services中就會(huì)多出一個(gè)服務(wù),顯示為File Watching Service,選擇啟動(dòng)就可以開(kāi)始監(jiān)視...

       總結(jié):

       在.NET創(chuàng)建的服務(wù)中調(diào)用System.IO.FileSystemWatcher對(duì)象,每次被監(jiān)視的文件或者文件夾變化的時(shí)候,調(diào)用IO系統(tǒng)的FileStream和StreamWriter把變更信息寫(xiě)到log文件中。實(shí)際上利用了.NET強(qiáng)大的內(nèi)置集成功能,把復(fù)雜的文件簡(jiǎn)單話。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多