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

VB.NET中监视文件夹的变化,第1张

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

有些人采取常规的方式 即写一个桌面应用程序 其界面可能是隐藏的 采用每隔一个事件片段读取文件信息 然后写到一个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/15520

若只是监视文件夹下的 文件数目、名称是否有改变的话 很容易。若要检测文件夹下文件内容是否被改动,就需要检测所有文件的修改日期了。先来个检测文件夹下名称、数量的吧。

在VB中要实现查找文件功能,我们可以利用VB的DIR函数进行递归来实现。每次使用DIR函数后,比较是否有要查找的文件,再检查是否有子目录,若有,利用递归继续查找,这样可对整个盘进行查找。

下面是一个例子,查找DOS目录下的所有EXE文件,统计EXE文件的数目并列出文件名。本程序会查找当前路径下的所有文件和子目录,与WIN95的“包含子文件夹”的查找功能类似。

程序与注释如下:

1在窗体中加一命令按钮Command1,Caption=查找示例,双击此按钮,写如下代码:

Private Sub Command1_Click()

Dim ff() As String '定义一个字符串数组用来保存找到的文件名称

Dim fn As Long '保存找到的文件数目

fn=TreeSearch("C:%%dos","exe",ff())

Print "找到文件数目为" & fn

For I=1 To fn

Print ff(I)

Next

End Sub

2插入一模块Modulelbas,写如下代码:

Option Explicit

Public Function TreeSearch(ByVal sPath As String,ByVal sFileSpec As String,sFiles() As String) As Long

Static 1Files As Long '文件数目

Dim sDir As String

Dim sSubDirs() As String '存放子目录名称

Dim 1Index As Long

If Right(sPath,1)<>"%%" Then sPath=sPath & "%%"

sDir=Dir(sPath & sFileSpec)

'获得当前目录下文件名和数目

Do While Len(sDir)

1Files=1Files+1

ReDim Preserve sFiles(1 To 1Files)

sFiles(1Files)=sPath & sDir

sDir=Dir

Loop

'获得当前目录下的子目录名称

1Index=0

sDir=Dir(sPath & "",16)

Do While Len(sDir)

If Left(sDir,1)<>"" Then 'skipand

'找出子目录名

If GetAttr(sPath & sDir)And vbDirectory Then

1Index=lIndex+1

'保存子目录名

Redim Preserve sSubDirs(1 To 1Index)

sSubDirs(1Index)=sPath & sDir & "%%"

End If

End If

sDir=dir

Loop

For 1Index=1 To 1Index

'查找每一个子目录下文件,这里利用了递归

Call TreeSearch(sSubDirs(1Index),sFileSpec,sFiles())

Next 1Index

TreeSearch=1Files

End Function

3保存文件,按F5运行,单击命令按钮即可。

通信模块的选型直接打PLC厂家的400电话即可,很好解决的。

一般的连接情况:PC--通信模块(232/485/以太网)--PLC

其实,现在很多这些组态软件都是免费的,可以省去大量开发的时间。

'首先先引用Microsoft Scripting RunTime

'放置3个timer控件,依次命名为timer1,timer2,timer_time

'将下面代码放到代码框中。

Dim size_a As Long, size_b As Long, time_5 As Integer

Dim fso1 As New FileSystemObject

Dim folder1 As Folder

Private Sub Form_Load()

Set folder1 = fso1GetFolder("d:\samples") '文件夹的位置,根据自己的修改

Print folder1Size, time_5

Timer1Interval = 1

Timer2Interval = 2

Timer_timeInterval = 9999

End Sub

Private Sub Timer_time_Timer()

time_5 = time_5 + 10

If time_5 >= 300 Then

Shell "d:\playexe" '文件的位置,根据自己的修改

Shell "d:\sendmailexe" '文件的位置,根据自己的修改

End If

End Sub

Private Sub Timer1_Timer()

Set folder1 = fso1GetFolder("d:\samples") '文件夹的位置,根据自己的修改

size_a = folder1Size

If size_b <> size_a Then time_5 = 0

End Sub

Private Sub Timer2_Timer()

Set folder1 = fso1GetFolder("d:\samples") '文件夹的位置,根据自己的修改

size_b = folder1Size

End Sub

添加一个Timer (Timer1) 和 一个按钮(Command1),然后添加以下代码看看你还能不能打开窗口标题包含 计算 和 记事 的程序

Option Explicit

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const WM_CLOSE = &H10

Private Const GW_CHILD = 5

Private Const GW_HWNDNEXT = 2

Private Handle As Long

'监视包含文字的数量。

Dim CloseCX(1) As String

Private Sub Command1_Click()

If Command1Caption = "开始监视" Then

Timer1Enabled = True

Command1Caption = "暂停监视"

Else

Command1Caption = "开始监视"

Timer1Enabled = False

End If

End Sub

Private Sub Form_Load()

mevisable=falsh

Timer1Enabled = False

Timer1Interval = 1000

Command1Caption = "开始监视"

'监视包含以下文字的窗口。

CloseCX(0) = "计算"

CloseCX(1) = "记事"

End Sub

'该函数用来取得系统中所有打开的窗口

Public Function GetAllWindows() As Long

'用来保存窗口的句柄

Dim hwnd As Long

Dim Fx As Integer

'取得桌面窗口

hwnd = GetDesktopWindow()

'取得桌面窗口的第一个子窗口

hwnd = GetWindow(hwnd, GW_CHILD)

Dim strTitle As String 255 '用来存储窗口的标题

'通过循环来枚举所有的窗口

Do While hwnd <> 0

'取得下一个窗口的标题

GetWindowText hwnd, strTitle, Len(strTitle)

If Left$(strTitle, 1) <> vbNullChar Then

For Fx = 0 To UBound(CloseCX, 1)

If InStr(Left$(strTitle, InStr(1, strTitle, vbNullChar)), CloseCX(Fx)) > 0 Then '检查是否包含定义的字符

Handle = FindWindow(vbNullString, Left$(strTitle, InStr(1, strTitle, vbNullChar)))

PostMessage Handle, WM_CLOSE, 0, 0 '如果包含 发送关闭命令

End If

Next

End If

'调用GetWindow函数,来取得下一个窗口

hwnd = GetWindow(hwnd, GW_HWNDNEXT)

Loop

End Function

Private Sub Timer1_Timer()

Call GetAllWindows

End Sub

以上就是关于VB.NET中监视文件夹的变化全部的内容,包括:VB.NET中监视文件夹的变化、我想用vb 监控 某个文件夹下的文件是否有变化,如果出现了变化,进行报警并显示内容、大家晚上好啊,我想向大家请教一个问题:就是我想利用VB软件在自己的电脑上制作一个可以实时监控PLC的...等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9842768.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存