【问题标题】:Restrictions on filesystemwatcher paths?对文件系统观察程序路径的限制?
【发布时间】:2018-09-18 03:47:50
【问题描述】:

我已经设置了我的 filesystemwatcher,但我得到了奇怪的结果。我发现如果我放置一个目录的完整路径,并设置包含子目录,那么更改会按应有的方式进行引导。但是我尝试做的失败是将我的"C:\" 驱动器设置为包含子目录的路径。

使用主驱动器作为路径是否有限制?

我已经尝试了它的所有语法,但没有成功。只是想知道那里是否有我不知道的东西...欢迎 cmets :)

如果有人想看一下,这里有相关的代码。建议会很棒:

<PermissionSet(SecurityAction.Demand, Name:="FullTrust")>
Private Sub WatchFolders()
    Dim myConn As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\kgene\source\repos\Test Program\Test Program\Resources\BakDb.accdb")

    MessageBox.Show("setting up watch folders")
    watcher = New FileSystemWatcher With {.NotifyFilter = NotifyFilters.DirectoryName Or NotifyFilters.FileName Or NotifyFilters.Attributes}
    watcher.Path = "c:\"
    watcher.IncludeSubdirectories = True
    watcher.EnableRaisingEvents = True

    AddHandler watcher.Changed, AddressOf LogChange
    AddHandler watcher.Created, AddressOf LogChange
    AddHandler watcher.Deleted, AddressOf LogChange
    AddHandler watcher.Renamed, AddressOf LogChangeR

End Sub

Private Sub LogChange(ByVal source As Object, ByVal e As FileSystemEventArgs)
    Dim myConn As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\kgene\source\repos\Test Program\Test Program\Resources\BakDb.accdb")
    Dim cmd As New OleDbCommand

    chkCnt = 0

    Try
        str = "SELECT Base, Target FROM Backup"
        cmd.Connection = myConn
        cmd.CommandText = str
        myConn.Open()
        Dim lstReader As OleDbDataReader = cmd.ExecuteReader()
        If cntPlns = 0 Then
            myConn.Close()
            Exit Sub
        End If
        lstReader.Read()
        Do Until chkCnt = cntPlns
            If lstReader.Item(0).ToString().ToLower() = Path.GetDirectoryName(e.FullPath).ToString.ToLower() Or lstReader.Item(1).ToString().ToLower() = Path.GetDirectoryName(e.FullPath).ToString().ToLower() Then
                If e.ChangeType = IO.WatcherChangeTypes.Changed Then
                    MessageBox.Show("first item changed")
                End If
                If e.ChangeType = IO.WatcherChangeTypes.Created Then
                    MessageBox.Show("first item create")
                End If
                If e.ChangeType = IO.WatcherChangeTypes.Deleted Then
                    MessageBox.Show("first item delete")
                End If
            End If
            If cntPlns = 0 Then
                myConn.Close()
                Exit Sub
            End If
            lstReader.Read()
            chkCnt += 1
        Loop
        chkCnt = 0
        myConn.Close()
    Catch ex As Exception
        chkCnt = 0
        myConn.Close()
        MessageBox.Show("There was a problem conncecting to the database to watch your folders")
        Exit Sub
    End Try
End Sub

【问题讨论】:

  • 诸如“尝试不成功”之类的描述永远不够。你需要具体说明发生了什么。如果您预计会引发事件而事实并非如此,请说出来。如果出现编译错误或运行时异常,请说出具体的错误消息以及发生错误的位置。不要用来猜测你已经知道的任何事情。
  • 抱歉,我认为我没有让 EventArgs 来验证我的路径是否按预期被监控是可以理解的。我只是设置了一个基本消息对话框来显示受影响文件的路径,因为我将进行更改,例如删除或添加文件到监视目录。路径永远不会出现在对话框中。其他 EventArgs 会,但不是应该监控的目录。所以我想知道使用“C:\”驱动器作为有效路径是否有任何限制。
  • 没有这样的限制。有些东西没有正确设置。如果你展示你的 FileSystemWatcher 实现,那么有人可以告诉你什么是什么。
  • 谢谢吉米。是的,我的代码中一定有一些不正确的东西。我编辑了我的问题以添加代码,所以请看一下,如果您认为有什么不对劲的地方,请告诉我。
  • watcher.EnableRaisingEvents = True 移到注册事件的代码之后。 -- 此时,您正在观察c: 驱动器中每个文件和目录的更改(可能是安装系统的位置、临时文件夹、浏览器缓存、用户文件、程序文件(... ) 被定位。单个 FSW 无法无限期地跟上这个。不在当前状态。您也在同一个驱动器中访问您的数据库。这也会导致 FSW 事件。您真的需要被通知文件系统的每一次变化?

标签: vb.net filesystemwatcher


【解决方案1】:

我搬家了

watcher.EnableRaisingEvents = True

在 Jimi 建议的注册事件的代码之后。这解决了设置监视文件夹以按预期注册事件的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多