【问题标题】:VB.Net FileSystemWatcher - Multiple Folders and Multiple FilesVB.Net FileSystemWatcher - 多个文件夹和多个文件
【发布时间】:2015-08-08 08:37:43
【问题描述】:

我需要监控一个根文件夹,该文件夹下有多个文件夹,每个文件夹包含多个文件 (.csv) 这些文件正在使用其他第三方工具从服务器复制到工作站。我必须监视工作站根的文件夹,并且当在任何子文件夹中创建或更新 .csv 文件时,我必须将 .csv 文件数据(更新的或新的)写入 sql server 数据库。在将数据写入 sql 服务器时,我需要捕获更新/创建 .csv 文件的子文件夹名称。这样我就可以在一个数据库文件中拥有单独的文件夹数据。

在工作站 PC 上运行程序时,应用程序崩溃而没有任何特定的错误消息。而且由于该应用程序是在远程 PC 上运行的,因此我无法调试该应用程序以检查导致崩溃的线路。下面是代码:

Public Class FolderWatchAndProcess
Dim blnMonitorUpdated As Boolean = True
Dim blnMonitorCreated As Boolean = True
Dim blnShowMessage As Boolean
Dim strFullFileName As String
Dim strFileName As String
Dim strFolderName As String
Private Delegate Sub updateLabel(ByVal newLabel As String)

Private Sub updateLabelHandler(ByVal labelText As String)
    lblMetNo.Text = labelText
End Sub

Private Sub ReadAndInsertCSVData()
' This routine checks for duplicates and inserts new records into the sql server database
End Sub

Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'lblMonitorPath.Text = "C:\RootFolder\"
    'btnStartWatching_Click(Nothing, Nothing)
    'Me.WindowState = FormWindowState.Minimized
End Sub

Private Sub btnStartWatching_Click(sender As Object, e As EventArgs) Handles btnStartWatching.Click
    btnStartWatching.Text = "Stop Watching"
    Dim aFileWatcherInstance As ArrayList = New ArrayList
    For Each sMonitorFolder As String In lstFolders.Items
        If IO.Directory.Exists(sMonitorFolder) Then
            Dim oFileWatcher As FileSystemWatcher = New FileSystemWatcher
            oFileWatcher.Path = sMonitorFolder
            oFileWatcher.Filter = "*.CSV"
            If blnMonitorUpdated Then
                AddHandler oFileWatcher.Changed, AddressOf Me.FileSystemWatcherUpdated
            Else
                'RemoveHandler , AddressOf Me.FileSystemWatcherUpdated
            End If
            If blnMonitorCreated Then
                AddHandler oFileWatcher.Created, AddressOf Me.FileSystemWatcherCreated
            Else
                'RemoveHandler , AddressOf Me.FileSystemWatcherCreated
            End If
            oFileWatcher.EnableRaisingEvents = True
            aFileWatcherInstance.Add(oFileWatcher)
        End If
    Next
End Sub

Private Sub FileSystemWatcherCreated(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
    strFullFileName = e.FullPath
    strFileName = Mid(e.Name, 3, Len(e.Name))
    strFolderName = strFileName.Split("_")(0)
    If Me.InvokeRequired Then
        Dim d As New updateLabel(AddressOf updateLabelHandler)
        Me.BeginInvoke(d, New Object() {strFolderName})
    Else
        updateLabelHandler(strFolderName)
    End If
    ReadAndInsertCSVData()
End Sub

Private Sub FileSystemWatcherDeleted(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
    'A file has been deleted from the child directory.
End Sub

Private Sub FileSystemWatcherUpdated(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
    strFullFileName = e.FullPath
    strFileName = Mid(e.Name, 3, Len(e.Name))
    strFolderName = strFileName.Split("_")(0)
    If Me.InvokeRequired Then
        Dim d As New updateLabel(AddressOf updateLabelHandler)
        Me.BeginInvoke(d, New Object() {strFolderName})
    Else
        updateLabelHandler(strFolderName)
    End If
    ReadAndInsertCSVData()
End Sub

结束类

任何帮助将不胜感激。

【问题讨论】:

  • 您是否添加了一些 try-catch 块并将任何错误记录到事件日志中?没有任何线索很难解决程序崩溃问题。
  • 我试过了,但在使用复制粘贴更新几个文件夹时无法检测到任何错误。它可能是由 SQL 服务器例程引起的,还是由第三方同步工具引起的,因为该文件在复制期间正在使用,并且在从服务器完成复制活动之前可能仍在使用中。
  • 在你的应用程序中,一定要订阅 AppDomain.CurrentDomain.UnhandledException 事件,当它发生时,记录异常。然后将您发现的异常添加到此问题中。
  • 如果你用try/catch快速安装VS express无法得到错误,那么你可以调试它来发现问题。
  • @mr_w_snipes,我已经包含了一个 try catch 块,但是由于它是客户端的机器,所以无法安装 vs express 或任何其他 ide。只是想知道上面的代码本身是否正确,或者可以通过包含线程/计时器等使其变得更好。建议表示赞赏。

标签: vb.net filesystemwatcher multiple-instances


【解决方案1】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多