Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将条目号追加到FileSystemWatcher输出_Vb.net_Math_Filesystemwatcher - Fatal编程技术网

Vb.net 将条目号追加到FileSystemWatcher输出

Vb.net 将条目号追加到FileSystemWatcher输出,vb.net,math,filesystemwatcher,Vb.net,Math,Filesystemwatcher,好, 在这里,我可能会被视为一篇非常棒的文章,我对VB或程序员都不是很熟练,但我正在“边做边学” 我正在开发一个应用程序,它为用户创建目录,并使用FileSystemWatcher跟踪创建的目录和对这些目录的更改 到目前为止,我已经收到了这个小片段(在回答你的评论时更新了Jimi): 按钮的私有子按钮\u单击: watchfolder = New System.IO.FileSystemWatcher() watchfolder.Path = TodaysScanFolder

好,

在这里,我可能会被视为一篇非常棒的文章,我对VB或程序员都不是很熟练,但我正在“边做边学”

我正在开发一个应用程序,它为用户创建目录,并使用FileSystemWatcher跟踪创建的目录和对这些目录的更改

到目前为止,我已经收到了这个小片段(在回答你的评论时更新了Jimi):

按钮的私有子按钮\u单击:

    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