尝试使用VB.NET创建Windows服务,该服务将监视使用FileSystemWatcher的文件夹中的更改。服务安装和启动良好,但当我添加或删除文件时不会触发任何事件。
"started“注释出现在事件日志中,但我没有得到其他事件日志条目。
我已经研究过其他使用FSW的例子(在VB和C#中),并且找不出哪里出了问题。我在一个不同的类中获得了FSW的细节,但是将其全部拉到一个类中,并尽可能地减少代码以排除故障。当我在被监视的文件夹中创建或删除一个文件时,仍然没有。
会不会是许可问题?我遗漏了什么?提前谢谢你。
Imports System.IO
Public Class TestFileWatcher
Dim WithEvents watcher As System.IO.FileSystemWatcher
Dim myLog As System.Diagnostics.EventLog
Dim folderName As String
Dim fileTypes As String
Protected Overrides Sub OnStart(ByVal args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
myLog = New System.Diagnostics.EventLog()
If Not EventLog.SourceExists("My Test Log") Then
EventLog.CreateEventSource("My Test Log", "Application")
End If
myLog.Source = "My Test Log"
folderName = "C:\temp\"
fileTypes = "*.*"
Try
watcher = New System.IO.FileSystemWatcher()
DefineWatcher()
watcher.EnableRaisingEvents = True
myLog.WriteEntry("started watcher")
Catch
ErrorHandler(e)
System.Environment.Exit(-1) '0=successful exit
End Try
End Sub
Protected Overrides Sub OnStop()
' Add code here to perform any tear-down necessary to stop your service.
StopWatcher()
End Sub
Public Sub StopWatcher()
watcher.Dispose()
End Sub
Public Sub RecordOnEventLog(ByVal str As String)
myLog.WriteEntry(str)
End Sub
Protected Sub ErrorHandler(ByVal e As ApplicationException)
Dim err As String
err = "ERROR" + vbCrLf
err += "Message: " + e.Message + vbCrLf
err += "Source: " + e.Source + vbCrLf
err += "Method: " + e.TargetSite.Name + vbCrLf
err += "Stack Trace: " + e.StackTrace + vbCrLf
err += "Error String: " + e.ToString + vbCrLf
err += "Application shut down at " & My.Computer.Clock.GmtTime.ToString
myLog.WriteEntry(err)
End Sub
Public Sub DefineWatcher()
watcher.BeginInit()
watcher.Path = folderName
watcher.Filter = fileTypes
watcher.IncludeSubdirectories = False
watcher.NotifyFilter = System.IO.NotifyFilters.FileName
watcher.NotifyFilter = watcher.NotifyFilter Or System.IO.NotifyFilters.Attributes
watcher.NotifyFilter = watcher.NotifyFilter Or System.IO.NotifyFilters.CreationTime
watcher.NotifyFilter = watcher.NotifyFilter Or System.IO.NotifyFilters.Security
AddHandler watcher.Created, AddressOf OnCreated
AddHandler watcher.Deleted, AddressOf OnDeleted
watcher.EndInit()
End Sub
Public Sub OnCreated(src As Object, e As FileSystemEventArgs)
RecordOnEventLog("New file added to temp folder, path: " + e.FullPath)
End Sub
Public Sub OnDeleted(src As Object, e As FileSystemEventArgs)
RecordOnEventLog("Item deleted")
End Sub
End Class
发布于 2022-07-14 15:44:08
谢谢你的帮助。不知道是什么阻止了它早些时候起作用,但现在起作用了。这是任何感兴趣的人的工作代码。
Option Strict On
Imports System.IO
Public Class TestFileWatcher
Dim watcher As System.IO.FileSystemWatcher = New System.IO.FileSystemWatcher()
Dim myLog As System.Diagnostics.EventLog = New System.Diagnostics.EventLog()
Dim folderName As String = "C:\temp"
Dim fileTypes As String = "*.*"
Dim myLogName As String = "My Test Log"
Protected Overrides Sub OnStart(ByVal args() As String)
StartLog()
Try
DefineWatcher()
watcher.EnableRaisingEvents = True
myLog.WriteEntry("started watcher hopefully")
Catch e As Exception
ErrorHandler(e)
System.Environment.Exit(-1) '0=successful exit
End Try
End Sub
Protected Overrides Sub OnStop()
StopWatcher()
End Sub
Private Sub StartLog()
If Not EventLog.SourceExists(myLogName) Then
EventLog.CreateEventSource(myLogName, "Application")
End If
myLog.Source = myLogName
End Sub
Private Sub StopWatcher()
watcher.Dispose()
End Sub
Private Sub RecordOnEventLog(ByVal str As String)
myLog.WriteEntry(str)
End Sub
Private Sub ErrorHandler(ByVal e As Exception)
Dim err As String
err = "ERROR" + vbCrLf
err += "Message: " + e.Message + vbCrLf
err += "Source: " + e.Source + vbCrLf
err += "Method: " + e.TargetSite.Name + vbCrLf
err += "Stack Trace: " + e.StackTrace + vbCrLf
err += "Error String: " + e.ToString + vbCrLf
err += "Application shut down at " & My.Computer.Clock.GmtTime.ToString
myLog.WriteEntry(err)
End Sub
Private Sub DefineWatcher()
watcher.BeginInit()
watcher.Path = folderName
watcher.Filter = fileTypes
watcher.IncludeSubdirectories = False
watcher.NotifyFilter = System.IO.NotifyFilters.FileName
watcher.NotifyFilter = watcher.NotifyFilter Or System.IO.NotifyFilters.Attributes
watcher.NotifyFilter = watcher.NotifyFilter Or System.IO.NotifyFilters.CreationTime
watcher.NotifyFilter = watcher.NotifyFilter Or System.IO.NotifyFilters.Security
AddHandler watcher.Created, AddressOf OnCreated
AddHandler watcher.Deleted, AddressOf OnDeleted
watcher.EndInit()
End Sub
Private Sub OnCreated(src As Object, e As FileSystemEventArgs)
RecordOnEventLog("New file added to temp folder, path: " + e.FullPath)
End Sub
Private Sub OnDeleted(src As Object, e As FileSystemEventArgs)
RecordOnEventLog("Item was deleted: " + e.FullPath)
End Sub
End Class
https://stackoverflow.com/questions/72981436
复制相似问题