Vb.net 将条目号追加到FileSystemWatcher输出
好, 在这里,我可能会被视为一篇非常棒的文章,我对VB或程序员都不是很熟练,但我正在“边做边学” 我正在开发一个应用程序,它为用户创建目录,并使用FileSystemWatcher跟踪创建的目录和对这些目录的更改 到目前为止,我已经收到了这个小片段(在回答你的评论时更新了Jimi): 按钮的私有子按钮\u单击:Vb.net 将条目号追加到FileSystemWatcher输出,vb.net,math,filesystemwatcher,Vb.net,Math,Filesystemwatcher,好, 在这里,我可能会被视为一篇非常棒的文章,我对VB或程序员都不是很熟练,但我正在“边做边学” 我正在开发一个应用程序,它为用户创建目录,并使用FileSystemWatcher跟踪创建的目录和对这些目录的更改 到目前为止,我已经收到了这个小片段(在回答你的评论时更新了Jimi): 按钮的私有子按钮\u单击: watchfolder = New System.IO.FileSystemWatcher() watchfolder.Path = TodaysScanFolder
watchfolder = New System.IO.FileSystemWatcher()
watchfolder.Path = TodaysScanFolder
watchfolder.Filter = ""
watchfolder.IncludeSubdirectories = True
watchfolder.NotifyFilter = IO.NotifyFilters.DirectoryName
watchfolder.NotifyFilter = watchfolder.NotifyFilter Or
IO.NotifyFilters.FileName
watchfolder.NotifyFilter = watchfolder.NotifyFilter Or
IO.NotifyFilters.Attributes
AddHandler watchfolder.Created, AddressOf logchange
AddHandler watchfolder.Deleted, AddressOf logchange
watchfolder.EnableRaisingEvents = True
btnStartScan.Enabled = False
btnStopScan.Enabled = True
End Sub
Public Sub logchange(ByVal source As Object, ByVal e As _
System.IO.FileSystemEventArgs)
If e.ChangeType = IO.WatcherChangeTypes.Created Then
txt_folderactivity.Text &= "File " & e.FullPath &
" has been created" & vbCrLf
End If
If e.ChangeType = IO.WatcherChangeTypes.Deleted Then
txt_folderactivity.Text &= "File " & e.FullPath &
" has been deleted" & vbCrLf
End If
End Sub
对于每个附加的活动,我想在前面用1将输出附加到txt_folderactivity.Text。然后是2,3,等等
您会看到这个文本框,在更改时将输出写入文本文件,如下所示:
Private Sub txt_folderactivity_TextChanged(sender As Object, e As EventArgs) Handles txt_folderactivity.TextChanged
str = txt_folderactivity.Text
My.Computer.FileSystem.WriteAllText(LogFileLoc, str, True)
End Sub
我希望该文本文件的每一行/条目都从1、2、3开始,依此类推。另外,正如我所说的VB初学者,似乎已经拼凑出了一些看起来有点凌乱但功能强大且对业务至关重要的东西,任何有关VB学习资源的良好开端的指针都将非常有用。谢谢大家这是一个继承自
FileSystemWatcher
的类它负责配置、启用和禁用事件引发,并具有基本的日志记录和报告功能。
文件系统监视程序的配置:
.BeginInit()
-.EndInit()
BeginInit()
用于防止在FileSystemWatcher
安装完成之前引发事件。将同步对象设置为表单组件。由于
FileSystemWatcher
事件是从系统线程池封送的,因此这确保在创建组件的同一线程上调用事件委托。如果
SynchronizingObject
为空,则访问该组件可能会导致异常,或者更糟的是,导致静默故障。内部缓冲区用于存储事件寄存器和文件路径。大于默认值(8192字节)的缓冲区可以防止缓冲区溢出,从而影响事件的上升。这里设置为32768字节。
.Path
对于网络驱动器/共享,请使用UNC路径。
如何使用它:
定义引用
FileWatcher类的公共对象:
Public FileWatch As FileWatcher
然后,您可以在需要时对其进行初始化:
FileWatch = New FileWatcher("[Path to watch]",
"*", 'All files
"[Path to LogFile]",
Me, 'Synchronizing Object
Me.[TextBox control used as monitor])
[用作监视器的文本框控件]
如果未使用,则可以无任何内容。
FileWatcher
不会立即开始引发/记录事件;在初始化方法中,EnableRaisingEvents
属性设置为False
。
您可以使用其方法启动和停止其活动:
Me.FileWatch.StartWatcher()
Me.FileWatch.StopWatcher()
启动和停止FileWatcher
是一个已注册(已记录)的活动。
使用列表(日期时间)
存储这些事件。请参阅FW_事件记录器类
其他存储信息包括:
- 删除的文件数。
- 创建的文件数
- 已注册事件的总数(用于比较)
- 日志文件的大小。
ActivityReport()
属性返回一个简单的报告:
Dictionary(Of String, String) = FileWatcher.ActivityReport()
这是日志文件的外观:
00000001 - 2018/02/28 21:00:25 - File D:\Temp\New Text Document.txt has been created
00000002 - 2018/02/28 21:00:29 - File D:\Temp\New Microsoft Access Database.accdb has been created
00000003 - 2018/02/28 21:00:34 - File D:\Temp\New WinZip File.zip has been created
00000004 - 2018/02/28 21:00:44 - File D:\Temp\New Microsoft Access Database.accdb has been deleted
00000005 - 2018/02/28 21:00:44 - File D:\Temp\New Text Document.txt has been deleted
00000006 - 2018/02/28 21:00:44 - File D:\Temp\New WinZip File.zip has been deleted
限制:如果请求(文本框控件引用被传递给类初始化),UI将通过
同步对象。如果UI线程因某种原因忙,则
底层FileSystemWatcher正在缓冲的事件将堆积起来。这
可以(而且既然可以)导致事件丢失。这是
内部缓冲区设置为默认值4倍的原因。不管怎样,它
如果受监控的活动很高,这将是不够的。正常情况下
条件下,它可以处理10/秒。没有问题的事件。除此之外,
必须使用使用FIFO队列缓冲区的异步代理方法
放置在事件侦听器和数据使用者之间
基于:
Visual Studio 2013, Update 5
.Net Framework 4.7.1
更新至:
Visual Studio 2017, 15.8.4
.Net Framework 4.7.1
导入System.Collections.Generic
导入System.IO
导入System.Windows.Forms
公共类文件监视程序
继承FileSystemWatcher
作为FW_事件记录器的专用事件记录器
私有提示为TextBox=无
公共分新()
我是新的(“,”,“,没什么,没什么)
端接头
Public Sub New(fswPath作为字符串,fswFilter作为字符串,日志文件作为字符串,SyncObject作为表单,SyncPrompt作为文本框)
Me.Prompt=SyncPrompt
Me.EventLogger=New FW_EventLogger和{.LogFileName=logFile}
SetupFileWatcher(fswPath、fswFilter、SyncObject)
端接头
公共子StartWatcher()
Me.EventLogger.TimeStart.Add(DateTime.UtcNow)
如果我的提示不是什么
Me.Prompt.AppendText(String.Format(“记录器开始时间:{0}”)+
Environment.NewLine,DateTime.UtcNow.ToString())
如果结束
Me.EnableRaisingEvents=True
端接头
公共副站长()
Me.EnableRaisingEvents=False
Me.EventLogger.TimeStop.Add(DateTime.UtcNow)
如果我的提示不是什么
Me.Prompt.AppendText(String.Format(“记录器停止时间:{0}”)+
Environment.NewLine,DateTime.UtcNow.ToString())
如果结束
端接头
作为字典的公共只读属性ActivityReport()(字符串的,字符串的)
得到
返回我。CreateActivityReport()
结束
端属性
公共属性PromptControl作为文本框
得到
马上给我回电话
结束
设置(值为文本框)
Me.Prompt=value
端集
端属性
公共子设置FileWatcher(fwPath作为字符串,fwFilter作为字符串,SyncObject作为表单)
如果fwPath.Le
Imports System.Collections.Generic
Imports System.IO
Imports System.Windows.Forms
Public Class FileWatcher
Inherits FileSystemWatcher
Private EventLogger As FW_EventLogger
Private Prompt As TextBox = Nothing
Public Sub New()
Me.New("", "", "", Nothing, Nothing)
End Sub
Public Sub New(fswPath As String, fswFilter As String, logFile As String, SyncObject As Form, SyncPrompt As TextBox)
Me.Prompt = SyncPrompt
Me.EventLogger = New FW_EventLogger With {.LogFileName = logFile}
SetupFileWatcher(fswPath, fswFilter, SyncObject)
End Sub
Public Sub StartWatcher()
Me.EventLogger.TimeStart.Add(DateTime.UtcNow)
If Me.Prompt IsNot Nothing Then
Me.Prompt.AppendText(String.Format("Logger Start Time: {0}" +
Environment.NewLine, DateTime.UtcNow.ToString()))
End If
Me.EnableRaisingEvents = True
End Sub
Public Sub StopWatcher()
Me.EnableRaisingEvents = False
Me.EventLogger.TimeStop.Add(DateTime.UtcNow)
If Me.Prompt IsNot Nothing Then
Me.Prompt.AppendText(String.Format("Logger Stop Time: {0}" +
Environment.NewLine, DateTime.UtcNow.ToString()))
End If
End Sub
Public ReadOnly Property ActivityReport() As Dictionary(Of String, String)
Get
Return Me.CreateActivityReport()
End Get
End Property
Public Property PromptControl As TextBox
Get
Return Me.Prompt
End Get
Set(value As TextBox)
Me.Prompt = value
End Set
End Property
Public Sub SetupFileWatcher(fwPath As String, fwFilter As String, SyncObject As Form)
If fwPath.Length = 0 Then
Return
End If
Me.BeginInit()
Me.SynchronizingObject = SyncObject
Me.InternalBufferSize = 32768
Me.IncludeSubdirectories = True
Me.Filter = fwFilter
Me.Path = fwPath
Me.NotifyFilter = NotifyFilters.FileName Or NotifyFilters.CreationTime
Me.EnableRaisingEvents = False
'Set the handler to the events you want to receive
AddHandler Me.Created, New FileSystemEventHandler(AddressOf Me.OnCreated)
AddHandler Me.Deleted, New FileSystemEventHandler(AddressOf Me.OnDeleted)
'The other events, should they become necessary.
'this.Changed += new FileSystemEventHandler(this.OnChanged);
'this.Renamed += new RenamedEventHandler(this.OnRenamed);
Me.EndInit()
End Sub
Private Function CreateActivityReport() As Dictionary(Of String, String)
With Me.EventLogger
Dim log As New Dictionary(Of String, String)
log.Add("Created", .FileCreated.ToString())
log.Add("Deleted", .FileDeleted.ToString())
log.Add("TotalEvents", .EventsLogged.ToString())
log.Add("LogFileSize", If(File.Exists(.LogFileName), New FileInfo(.LogFileName).Length.ToString(), "N/A"))
log.Add("StartTime", If(.TimeStart.Count > 0, .TimeStart.First().ToString(), "Not Started"))
log.Add("LastStopTime", If(.TimeStop.Count > 0, .TimeStop.Last().ToString(), "Never"))
log.Add("Status", If(Me.EnableRaisingEvents = True, "Running", "Stopped"))
Return log
End With
End Function
Protected Overloads Sub OnCreated(sender As Object, e As FileSystemEventArgs)
Dim Msg As String = "File " & e.FullPath & " has been created"
Me.EventLogger.Update(Msg, FW_EventLogger.EventType.FileCreated)
If Me.Prompt IsNot Nothing Then
Me.Prompt.AppendText(Msg + Environment.NewLine)
Me.Prompt.ScrollToCaret()
End If
End Sub
Protected Overloads Sub OnDeleted(sender As Object, e As FileSystemEventArgs)
Dim Msg As String = "File " & e.FullPath & " has been deleted"
Me.EventLogger.Update(Msg, FW_EventLogger.EventType.FileDeleted)
If Me.Prompt IsNot Nothing Then
Me.Prompt.AppendText(Msg + Environment.NewLine)
Me.Prompt.ScrollToCaret()
End If
End Sub
'The Event Logger Class
Private Class FW_EventLogger
Sub New()
Me.TimeStart = New List(Of DateTime)
Me.TimeStop = New List(Of DateTime)
End Sub
Public Enum EventType As Integer
FileCreated = 0
FileDeleted
End Enum
Public Property FileDeleted As Integer
Public Property FileCreated As Integer
Public Property EventsLogged As Integer
Public Property TimeStart As List(Of DateTime)
Public Property TimeStop As List(Of DateTime)
Public Property LogFileName As String
Public Sub Update(NewEvent As String, TypeOfEvent As EventType)
If Me.LogFileName <> String.Empty Then
If TypeOfEvent = EventType.FileCreated Then Me.FileCreated += 1
If TypeOfEvent = EventType.FileDeleted Then Me.FileDeleted += 1
Me.EventsLogged += 1
Using LogFileWriter As StreamWriter = New StreamWriter(Me.LogFileName, True, Encoding.UTF8)
LogFileWriter.WriteLine(Me.EventsLogged.ToString().PadLeft(8, "0"c) +
" - {0} - {1}", DateTime.UtcNow.ToString("yyyy/MM/dd hh:mm:ss"), NewEvent)
End Using
End If
End Sub
End Class
End Class