有些人采取常规的方式 即写一个桌面应用程序 其界面可能是隐藏的 采用每隔一个事件片段读取文件信息 然后写到一个log文件中 然后设置系统启动的事件自动加载程序 (好像很多人是这样窃取QQ密码的 ) 其缺点 不是连续的获取信息 因为他们采用了Timer的tick事件 在NT系统中 可能要一定的权限才可以运行 比如要管理员身份等 还有系统中会有进程显示 显然很容易shut down
我们建议的方案 采用 NET的Windows Service 首先可以克服以上缺点 而且较VB 的编程而言 NET中写windows service一如反掌
思路 在 NET创建的服务中调用System IO FileSystemWatcher对象 每次被监视的文件或者文件夹变化的时候 调用IO系统的FileStream和StreamWriter把变更信息写到log文件中
关于 NET中的Windows服务
Windows服务 是一些长久运行的程序 而并不需要依靠登录用户或客户程序来保持它的运行 它们没有自己的用户界面 可以在它们自己独有的安全级别和会话上下文中运行 我们比较熟悉的Windows服务范例包含了从打印池到SQL服务器以及它的分布式事务协作(DTC) 服务只可以运行在NT 以及后继产品比如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名空间(这就是创建一个服务的函数集) 从工具中的组件中选择FileSystemWatcher 拖放到service 的设计模式上 然后设置如下属性
Filter 获取或设置筛选字符串 用于确定在目录中监视哪些文件 我们设置为* * 即所有文件 IncludeSubdirectories 获取或设置一个值 该值指示是否监视指定路径中的子目录 设置为true Path 获取或设置要监视的目录的路径 设置为我们要监视的对象 比如C:\DonnetData然后添加以下代码
Protected Overrides Sub OnStart(ByVal args() As String)
在此处添加启动服务的代码 此方法应设置具体的 *** 作
以便服务可以执行它的工作
FileSystemWatcher EnableRaisingEvents = True
我们也可以根据输入的参数args动态设定要监视的对象
FileSystemWatcher path= args( )
End Sub
创建文件(夹)时候触发 记录创建信息到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 &创建 &e FullPath)
sw Close()
fs Close()
End Sub
Rename文件(夹)时候触发 记录创建信息到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
删除文件(夹)时候触发 记录创建信息到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
到目前为止 这个服务已经写好了 下面作一个安装程序
在service的设计模式上点击右键 选择添加安装程序 系统会自动添加一个类ProjectInstaller 设计模式上有一个ServiceProcessInstaller 和ServiceInstaller 设置ServiceInstaller 的Display Name为File Watching Service starttype为Automatic 表示自动启动 设置ServiceProcessInstaller 的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 选择启动就可以开始监视
总结
lishixinzhi/Article/program/net/201311/15520Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
FileSystemWatcher1.NotifyFilter = IO.NotifyFilters.DirectoryName Or IO.NotifyFilters.FileName‘监控文件夹和文件。
FileSystemWatcher1.IncludeSubdirectories = True’监控子文件夹
End Sub
Private Sub FileSystemWatcher1_Renamed(sender As Object, e As IO.RenamedEventArgs) Handles FileSystemWatcher1.Renamed
MsgBox(e.FullPath &vbCrLf &e.Name)
End Sub'捕获新路径
你监控test不就好了,若要排除其他文件夹,IncludeSubdirectories 设为假,用多个FileSystemWatcher就行了,用数组或其他方式创建。
楼上所说的也就是所谓的目录监视器吧?用API可以完成此任务,不用什么TIMER就行。用API(FindFirstChangeNotification)然后建立一个等待事件内核对象,当有事件发生时等待成功,这时你可以进行你想要的 *** 作。
在VB中的API的用法需要你自己探索,我是VC用的好一点,VB不怎么会用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)