VB.Net FileSystemWatcher - несколько папок и несколько файлов

У меня есть требование контролировать корневую папку, в которой есть несколько папок, и каждая папка содержит несколько файлов (.csv). Эти файлы копируются на рабочую станцию ​​с сервера с помощью какого-либо другого стороннего инструмента. Я должен следить за папкой корня рабочей станции, и, когда файл.csv создается или обновляется в любой из дочерних папок, я должен записывать данные файла.csv (обновленные или новые) в базу данных сервера sql. При записи данных на сервер sql мне нужно записать имя дочерней папки, в которой был обновлен / создан файл.csv. Таким образом, я могу иметь данные отдельной папки в одном файле базы данных.

При запуске программы на компьютере рабочей станции происходит сбой приложения без какого-либо конкретного сообщения об ошибке. И поскольку приложение запускается на удаленном компьютере, я не могу отладить приложение, чтобы проверить, какая строка вызывает сбой. Ниже приведен код:

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

Конечный класс

Любая помощь будет оценена.

1 ответ

Измененное событие сработает несколько раз:

https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.changed(v=vs.110).aspx

возможно, вы можете использовать функцию IsFileLocked, о которой здесь сказано:

Иногда я получаю исключение на System.Threading.Tasks.TaskCompletionSource, как я могу решить это?

Другие вопросы по тегам