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

原创 2002年11月04日 13:10:00

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

摘要 :

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

       有些人采取常规的方式,即写一个桌面应用程序,其界面可能是隐藏的。采用每隔一个事件片段读取文件信息,然后写到一个log文件中。然后设置系统启动的事件自动加载程序,(好像很多人是这样窃取QQ密码的:()。其缺点:1、不是连续的获取信息,因为他们采用了Timertick事件;2、在NT系统中,可能要一定的权限才可以运行,比如要管理员身份等。还有系统中会有进程显示,显然很容易shutdown.

       我们建议的方案:采用.NETWindows Service。首先可以克服以上缺点,而且较VB6的编程而言,.NET中写windows service一如反掌。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

思路:

       .NET创建的服务中调用System.IO.FileSystemWatcher对象,每次被监视的文件或者文件夹变化的时候,调用IO系统的FileStreamStreamWriter把变更信息写到log文件中。

正文:

       关于.NET中的Windows服务:

       Windows服务,是一些长久运行的程序,而并不需要依靠登录用户或客户程序来保持它的运行。它们没有自己的用户界面,可以在它们自己独有的安全级别和会话上下文中运行。我们比较熟悉的Windows服务范例包含了从打印池到SQL服务器以及它的分布式事务协作(DTC)。服务只可以运行在NT2000以及后继产品比如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 的上下文菜单中启用“停止”、“暂停”或“继续”。如果已启用,则相应的命令将传递到服务,并且调用 OnStopOnPause OnContinue。如果 CanStopCanShutdown CanPauseAndContinue false,则即使已实现相应的命令处理方法(如 OnStop),也不会予以处理。

 

       上面是创建任何一个服务,我们都会涉及到的只是,具体在监视文件夹变化的时候,我们用到了FileSystemWatcher

 

关于FileSystemWatcher

 

       侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。

       使用 FileSystemWatcher 监视指定目录中的更改。可监视指定目录中的文件或子目录的更改。该组件可以监视本地计算机、网络驱动器或远程计算机上的文件。(当然只读的媒体介质比如cddvd,它们文件的属性不会改变,所以也就不能触发事件)

       若要监视所有文件中的更改,请将 Filter 属性设置为空字符串 ("")。若要监视特定的文件,请将 Filter 属性设置为该文件名。例如,若要监视文件 MyDoc.txt 中的更改,请将 Filter 属性设置为“MyDoc.txt”。也可以监视特定类型文件中的更改。例如,若要监视文本文件中的更改,请将 Filter 属性设置为“*.txt”。

       可监视目录或文件中的若干种更改。例如,可监视文件或目录的 AttributesLastWrite 日期和时间或 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。设置ServiceInstaller1Display NameFile Watching ServicestarttypeAutomatic,表示自动启动。设置ServiceProcessInstaller1 accountLocalSystem

由于服务是不能运行的,我们选择生成解决方案。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系统的FileStreamStreamWriter把变更信息写到log文件中。实际上利用了.NET强大的内置集成功能,把复杂的文件简单话。

             

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

摘要 :        有时候,处于业务的需要,我们要不断的监视文件的变化,比如文件的创建、删除、重命名等;而且某些人要确保重要文件的只读,并且要及时的报告文件版本的变更情况。或者,你想监视你的...
  • Seal203
  • Seal203
  • 2015年07月03日 23:41
  • 1103

Java监控文件夹或文件的变动

Java监控文件夹或文件的变动 很多时候我们需要对文件夹或者文件进行监控,已观察其是否被删除、创建或者修改,然后根据文件的行为进行相应的后续处理,以往的话多数是通过轮询去观察文件夹或者文件的...
  • peterxiaoq
  • peterxiaoq
  • 2016年09月08日 14:41
  • 3100

java监控路径下文件变化

之前用jdk7的WatchService API(java.nio.file包)来做目录下的子文件监控,后改为使用commons-io包。主要有下面几点不同:1. WatchService是采用扫描式...
  • u013673976
  • u013673976
  • 2015年12月28日 00:07
  • 3635

VB.net 监视Windows剪切板中数据变化

新建一个Winform,拉进去一个PictureBox控件,完整代码如下,实现效果即当剪切板中更新图片数据的时候,picturebox中自动显示出来剪切板中的图片 Public Class clip...
  • lpwmm
  • lpwmm
  • 2016年02月27日 23:30
  • 347

java 实现监控某目录文件变化

commons-io-2.3.jar 中,有实现文件监控的类,在org.apache.commons.io.monitor包下, 主要包括 observer ,listener,monitor 含义你...
  • masternick
  • masternick
  • 2013年09月30日 15:41
  • 16378

VB.NET实现Windows剪贴板监视器

Windows剪贴板剪贴板(ClipBoard)是内存中的一块区域,是Windows内置的一个非常有用的工具,通过小小的剪贴板,架起了一座彩桥,使得在各种应用程序之间,传递和共享信息成为可能。然而美中...
  • testcs_dn
  • testcs_dn
  • 2014年12月25日 14:43
  • 3863

使用QFileSystemWatcher监控磁盘文件状态变化

使用QFileSystemWatcher类可以实时监视磁盘上某个文件或目录的状态是否发生变化,比如删除、重命名等。我们只需将要监视的文件或目录通过其成员函数addPath() 或 addPaths()...
  • Amnes1a
  • Amnes1a
  • 2017年03月24日 10:08
  • 643

python中文件变化监控-watchdog

python通过watchdog对windows平台指定文件夹进行变动检测。
  • cracker_zhou
  • cracker_zhou
  • 2016年02月20日 14:31
  • 11505

c#如何监视文件或者文件夹的变化

原文出处:http://www.cnblogs.com/rainuu/archive/2010/03/12/1684834.html FileSystemWatcher 基础用法 1....
  • qq_33140565
  • qq_33140565
  • 2017年07月18日 16:06
  • 117

iOS监控/监测/监听文件/文件夹的变化 检测文件变化

我们有些时候,需要监测一个文件/文件夹的变化,例如在某个文件被修改的时候,可以获取到通知,或者我们有个播放列表是扫描某个文件夹下的所有文件,那么当这个目录新添或者删除一些文件后,我们的播放列表要同步更...
  • yohunl
  • yohunl
  • 2016年11月18日 11:38
  • 1800
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB.NET中监视文件夹的变化
举报原因:
原因补充:

(最多只允许输入30个字)