王朝网络
分享
 
 
 

VB.NET中监视文件夹的变化

王朝vb·作者佚名  2006-01-08
宽屏版  字体: |||超大  

VB.NET中监视文件夹的变化

Montaque

摘要 :

有时候,处于业务的需要,我们要不断的监视文件的变化,比如文件的创建、删除、重命名等;而且某些人要确保重要文件的只读,并且要及时的报告文件版本的变更情况。或者,你想监视你的文件夹被别人更改、肆意删除而又不知道是谁干的,在什么时候干的?于是你就考虑要写一个监视程序,“偷偷的”记录文件夹被操作的情况。

有些人采取常规的方式,即写一个桌面应用程序,其界面可能是隐藏的。采用每隔一个事件片段读取文件信息,然后写到一个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强大的内置集成功能,把复杂的文件简单话。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有