【发布时间】: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 事件。您真的需要被通知文件系统的每一次变化?